新的Date()在Chrome和Firefox中的工作方式不同

cuo*_*gle 91 javascript timezone date

我想Date通过javascript 转换日期字符串,使用此代码:

var date = new Date('2013-02-27T17:00:00');
alert(date);
Run Code Online (Sandbox Code Playgroud)

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

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

Firefox返回:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)
Run Code Online (Sandbox Code Playgroud)

Chrome返回:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pet*_*lin 66

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

  • 谢谢.这有效.但是有一个日志说,它将来会被弃用!!! 有什么想法吗? (2认同)

Ber*_*rgi 29

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

String可以解释为本地时间,UTC时间或某个其他时区的时间,具体取决于String的内容.该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调出的规则来解析字符串的格式.如果String不符合该格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的日期格式.

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

  • 好的,纠正.看起来像[ES5.1规范中的错误](https://bugs.ecmascript.org/show_bug.cgi?id=112) - 目的是匹配ISO-8601,其中缺少Z表示当地时间(因此Chrome匹配) ES5.1,Firefox和IE匹配ISO-8601) (12认同)
  • 但规范(15.9.1.15)实际上说:"缺席时区偏移的值是"Z"" - 因此它不应该依赖于实现 (2认同)
  • 奇怪地使用Date.Parse与新的Date修复了我在Chrome将日期转换为本地时区的问题,而不是将其视为当地时区. (2认同)