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

IT技术 javascript date timezone
2021-01-11 18:56:36

我想将日期字符串转换为Datejavascript,使用以下代码:

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

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

但是上面代码的结果在 Firefox 和 Chrome 之间是不同的:

火狐返回:

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

Chrome 返回:

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

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

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

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

5个回答

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

谢谢。这有效。但是有日志说,将来会被弃用!!!。请问有什么想法吗?
2021-03-21 18:56:36
非常感谢,我已经解决这个问题两天了,但是这篇文章解决了所有问题。
2021-04-07 18:56:36

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

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

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

@KingOfHypocrites——这有点奇怪,因为使用字符串调用 Date 构造函数应该与使用Date.parse相同
2021-03-12 18:56:36
@sinelaw:感谢您进一步调查这一点。但是,无论规范说明了什么,[旧] 浏览器的做法仍然不同:-)
2021-03-14 18:56:36
但是规范(15.9.1.15)实际上说:“不存在的时区偏移的值是“Z””——所以它不应该依赖于实现
2021-03-18 18:56:36
好的,更正。看起来像是ES5.1 规范中的一个错误- 目的是匹配 ISO-8601,其中缺少 Z 表示本地时间(因此 Chrome 匹配 ES5.1,Firefox 和 IE 匹配 ISO-8601)
2021-03-27 18:56:36
奇怪的是,使用 Date.Parse 与 new Date 解决了我遇到的问题,Chrome 会将日期转换为本地时区,而不是将其视为本地时区。
2021-04-09 18:56:36

我在这里发现了一件事。似乎原生 Firefox Inspector 控制台可能有一个错误:如果我在原生 Inspector 中运行“new Date()”,它会显示一个带有错误时区、GMT 语言环境的日期,但在 Firebug 扩展控制台中运行相同的命令,日期显示使用我的正确时区 (GMT-3:00)。

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

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

在此处输入图片说明

尝试使用 moment.js。它运行得非常好,并且与所有浏览器都以类似的方式运行。带有许多格式选项。使用 moment('date').format("") 而不是 New Date('date')