关于javascript:new Date()在Chrome和Firefox中的工作方式不同

new Date() works differently in Chrome and Firefox

我想通过javascript将日期字符串转换为Date,请使用以下代码:

1
2
var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00'是来自服务器的JSON对象中的UTC时间。

但上述代码的结果在Firefox和Chrome之间有所不同:

Firefox返回:

1
Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome返回:

1
Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time)

这是不同的1天,我期望的正确结果是Chrome的结果。

演示代码:http://jsfiddle.net/xHtqa/2/

如何解决这个问题以从两者中获得相同的结果?


UTC的正确格式为2013-02-27T17:00:00Z(Z代表祖鲁时间)。如果不存在则附加Z以获取正确的UTC日期时间字符串。


是的,不幸的是,日期解析算法依赖于实现。从Date.parse的规范(由new Date使用):

The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String. The function first attempts to parse the format of the String according to the rules called out in Date Time String Format (15.9.1.15). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats.

要使Date构造函数不(可能)使用本地时区,请使用带有时区信息的日期时间字符串,例如"2013-02-27T17:00:00Z"。但是,很难找到每个浏览器可靠解析的格式 - IE <8不能识别ISO格式(请参阅JavaScript:哪些浏览器支持使用Date.parse解析ISO-8601日期字符串)。更好的是,使用unix时间戳,即自unix epoch以来的毫秒,或者使用正则表达式将字符串分解为其部分,然后将这些字符串输入Date.UTC


我在这里发现了一件事。看来原生的Firefox Inspector Console可能有一个错误:
如果我在本机Inspector中运行"new Date()",它会显示一个错误的时区,GMT语言环境的日期,但在Firebug Extension Console中运行相同的命令,显示的日期使用我的正确时区(GMT-3:00) 。


尝试使用moment.js。与所有浏览器类似,它非常好用。附带许多格式选项。使用时刻('日期')。格式(")而不是新日期('日期')


注意到FireFox没有返回与Chrome相同的结果。看起来你在日期的kendo.toString中使用的格式有所不同。

最后的控制台结果是我需要的:

enter image description here