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

11
对于一个oData Rest服务,我使用Moment.js从Unix时间戳创建日期,我想忽略时区。 我的日期是“2013-12-24”,对应的Unix秒数为1387839600。
使用:
moment("2013-12-24", "YYYY-MM-DD").toISOString()

由于我生活在GMT+1时区,所以结果为"2013-12-23T23:00:00.000Z"。

通过使用

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"。

我的哪里有问题? 谢谢你的帮助!


使用moment.utc(moment("1387839600", "X").format("L"), "DD.MM.YYYY").toISOString()可以运行,但这似乎相当复杂!? - Windwalker
1
还是只用 moment(1387839600, 'X').format('YYYY-MM-DDT00:00:00.000') - robertklep
谢谢@robertklep,我想把你的评论作为我的问题的答案来接受,但很遗憾我无法将你的评论提升为完整的答案... - Windwalker
4个回答

19

无论是以秒还是毫秒为单位的Unix时间戳,它们始终使用协调世界时(UTC)。值1387839600确实是2013年12月23日晚上11点(UTC)。您可以使用类似这样的网站进行验证。

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

因此,Moment.js的行为是正确的。相反,您应该关注您的REST API,并确保它正确地发出UTC而不是本地时间值。

另外,如果您只想要日期部分,请勿使用.toISOString。请使用.format,例如:

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

7

您可以“编造”自己的格式。任何需要原样复制(而不是插值)的字符串应该包含在方括号中。

因此,在您的情况下,这应该有效:

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

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毫秒时间戳(x)传入,而不是Unix时间戳(X),如果有任何疑问,可以注意这一点。
这将输出类似于 2015-07-15T15:02:00.000+00:00 的字符串。

1
不要使用toISOString()。相反,使用类似于以下内容的东西:
moment.utc(1387839600, "X").utcOffset(1).format('YYYY-MM-DD') + "[T" + moment.utc(1387839600, "X").utcOffset(1).format('HH:mm:ss.000]')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接