从Unix时间戳创建日期忽略时区

时间:2013-12-20 09:16:36

标签: javascript date datetime momentjs

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

使用

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”这正是我想要的。我可以在最后删除Zulu时间的“Z”。

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

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

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

我的错在哪里? 谢谢你的帮助!

4 个答案:

答案 0 :(得分:16)

Unix时间戳(以秒或毫秒为单位)始终(UTC)。值1387839600确实是2013-12-23 UTC时间晚上11点。您可以使用sites like this one进行验证。

如果您希望它在UTC午夜的2013-12-24,则时间戳为1387843200

所以时刻表现得正确。您应该专注于您的rest API,并确保它正确地发出UTC而不是本地时间值。

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

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

答案 1 :(得分:5)

你可以'弥补'你自己的格式。任何需要按原样复制的字符串(未插入)都应包含在括号内。

所以在你的情况下,这应该有效:

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

答案 2 :(得分:3)

调整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 ms时间戳(x)而不是Unix时间戳(X)的形式出现,以防万一造成混乱。

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

这样的字符串

答案 3 :(得分:1)

请勿使用toISOString()。而是使用这样的东西:

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