对于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”。
我的错在哪里? 谢谢你的帮助!
答案 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]')