2013-12-20 77 views
7

对于oData Rest服务,我使用Moment.js从Unix时间戳创建日期,并且我想忽略时区。 我的日期是“2013-12-24”,在Unix秒内是1387839600。从Unix时间戳创建日期忽略时区

在使用

moment("2013-12-24", "YYYY-MM-DD").toISOString() 

结果 “2013-12-23T23:00:00.000Z”,因为我住在GMT + 1。 通过使用

moment.utc("2013-12-24", "YYYY-MM-DD").toISOString() 

我得到 “2013-12-24T00:00:00.000Z” 这正是我想要的。我可以简单地删除祖鲁时间的“Z”结尾。

但我的日期的真实表示是一个Unix时间戳。所以,如果我做

moment.utc(1387839600, "X").toISOString() 

我总是得到 “2013-12-23T23:00:00.000Z”,但我想它返回 “2013-12-24T00:00:00.000Z”。

我的错在哪里? 感谢您的帮助!

+0

使用 moment.utc一个字符串(力矩( “1387839600”, “X”)。格式( “L”), “DD.MM.YYYY”)。toISOString() 的作品,但似乎相当复杂!? – Windwalker

+1

或只是'moment(1387839600,'X')。format('YYYY-MM-DDT00:00:00.000')'? – robertklep

+0

谢谢@robertklep,我想接受您的评论作为我的问题的答案,但不幸的是我无法将您的评论推广至完整答案... – Windwalker

回答

16

Unix时间戳,无论是以秒还是以毫秒为单位,都是,始终为UTC的。价值1387839600确实是2013年12月23日23点UTC。您使用sites like this one进行验证。

如果您希望它在2013年12月24日UTC的午夜时间,时间戳将为1387843200

所以时刻表现正确。你应该把注意力集中在你的rest API上,并确保它正确地发出UTC而不是本地时间值。

此外,如果您只是想要日期部分,那么请不要使用.toISOString。相反,使用.format,例如:

moment.utc(1387843200, 'X').format('YYYY-MM-DD') 
5

您可以'组成'自己的格式。任何需要复制的字符串(不是插值的)都应该包含在括号内。

所以在您的情况,这应该工作:

moment(1387839600, 'X').format('YYYY-MM-DD[T00:00:00.000]') 
+0

YYYY-MM-DD是有效的ISO日期! http://en.wikipedia.org/wiki/ISO_8601 – laktak

1

不要使用toISOString()。相反,使用这样的:

moment.utc(1387839600, "X").utcOffset(1).format('YYYY-MM-DD') + "[T" + moment.utc(1387839600, "X").utcOffset(1).format('HH:mm:ss.000]') 
2

调整的onChange功能后,像

<DateTimeField mode="date" inputFormat='MM-DD-YYYY' onChange= {this.onChange} />

的的onChange函数可以是这样的:

onChange: function(value) { console.log({myDate: moment.utc(value, 'x').format('YYYY-MM-DDTHH:mm:ss.SSSZ')}); },

看来的onChange值是Unix时间戳记(x)而不是Unix时间戳记(X)一直困惑。

这应打印像2015-07-15T15:02:00.000+00:00