一旦Date对象被创建为
var oDate = new Date(2014,01,21,23,00,00);
返回时间为2014年2月21日星期五23:00:00 GMT+0530(印度标准时间(。但是当我尝试将其转换为JSON时。
oDate.toJSON() // "2014-02-21T17:30:00.000Z"
为什么小时和分钟会更改?小时应为23,分钟应为00。
当您在Date对象上调用toJSON()
时,它会使用符合ISO8601标准的toISOString()
返回一个表示Date的字符串,例如YYYY-MM-DDTHH:MM:ss.sssZ。时区是始终UTC,因此在您的示例中有所不同。
请参阅此处以获取有关Javascript中Date对象的更多信息。
关于您的示例,有几件事需要提及:
- 日期和时间是特定于区域设置的,您的浏览器会根据您的系统时钟建立日期和时间(您可以更改此设置(
- 当您序列化日期和时间时,此区域设置信息将被转换为时间戳
- 如果您将此时间戳保存在数据库中,然后使用
Date.parse()
将此信息重新加载到浏览器中,然后您的浏览器将以适合您当前时区的日期和时间显示此信息,例如印度标准时间
我创建了一个简单的jsFiddle作为示例。在我当前的时区GMT中,当查看winterDate
和summerDate
时,这是一个重要的例子,因为在这个时区的夏季,我们输入夏令时并将时间提前一小时。重要的是,Javascript能够理解这一点,并捕捉时区,从而保留事件发生时间的普遍价值。如果您更改系统的时区,然后重新加载浏览器,您将能够亲眼看到这种行为。
我希望这能帮助你更多地了解这种行为,以及为什么它很重要。
为什么小时和分钟会更改?
因为它不再用控制台中显示的印度标准时间表示,而是用UTC(Zulu时间,如ISO 8601字符串所示(表示。
小时应为23,分钟应为00。
没有。如果你想在UTC中创建一个23:00的时间,那么你应该使用
var oDate = new Date(Date.UTC(2014,01,21,23,00,00));
这实际上是按预期工作的,并序列化为UTC,因为当您加载JSON对象时,您会再次获得正确的Date。使用toJSON((时,时间以UTC存储。
指定人:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON
测试代码:
var oDate = (new Date()).toJSON();
var pDate = new Date(oDate);
console.log("Serialized date object: " + oDate);
console.log("Actual date object: " + pDate);
请记住,"2014-02-21T17:3:00.000Z"中的最后一个"Z"表示时间确实在UTC 中
更多信息:-
http://en.wikipedia.org/wiki/ISO_8601
供参考:-
如何格式化Microsoft JSON日期?