new Date() 在 Chrome 和 Firefox 中的工作方式不同
Posted
技术标签:
【中文标题】new Date() 在 Chrome 和 Firefox 中的工作方式不同【英文标题】:new Date() works differently in Chrome and Firefox 【发布时间】:2013-02-13 03:07:47 【问题描述】:我想通过 javascript 将日期字符串转换为Date
,使用以下代码:
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/
如何解决此问题以从两者中获得相同的结果?
【问题讨论】:
是在同一台电脑上吗? @Sandeep 主要的一点是 Chrome 添加了时区偏移,而 Firefox 没有 @CuongLe 看到这个问题了吗:***.com/questions/9062863/… 我在这两种情况下都是Date Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)
(Linux)。
Nitpicker 的角落:«JSON 格式的 UTC 时间» - JSON 格式?准确地说,关于 JSON 的一个常见抱怨是它根本没有定义任何日期格式。
【参考方案1】:
UTC 的正确格式是2013-02-27T17:00:00Z
(Z 代表祖鲁时间)。追加Z
(如果不存在)以获取正确的 UTC 日期时间字符串。
【讨论】:
谢谢。这行得通。但是有一个日志说,将来会被弃用!!!。请问有什么想法吗? 非常感谢,我已经解决这个问题两天了,但这篇文章解决了一切。【参考方案2】:是的,不幸的是,日期解析算法是依赖于实现的。来自specification of Date.parse
(由new Date
使用):
根据字符串的内容,字符串可能被解释为本地时间、UTC 时间或其他时区的时间。该函数首先尝试根据日期时间字符串格式 (15.9.1.15) 中调用的规则解析字符串的格式。如果字符串不符合该格式,则函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。
要使Date
constructor 不(可能)使用本地时区,请使用带有时区信息的日期时间字符串,例如"2013-02-27T17:00:00Z"
。但是,很难找到一种可以被每个浏览器可靠解析的格式——IEJavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse)。更好的是,使用 unix 时间戳,即自 unix epoch 以来的毫秒数,或者使用正则表达式将字符串分解为各个部分,然后将它们输入到 Date.UTC
。
【讨论】:
但规范 (15.9.1.15) 实际上说:“缺少时区偏移的值是“Z”” - 所以它不应该依赖于实现 好的,更正。看起来像 mistake in the ES5.1 spec - 目的是匹配 ISO-8601,其中缺少 Z 表示本地时间(因此 Chrome 匹配 ES5.1,Firefox 和 IE 匹配 ISO-8601) @sinelaw:感谢您进一步调查这一点。但是,无论规范说明什么,[旧] 浏览器的做法仍然不同 :-) 奇怪地使用 Date.Parse 与 new Date 解决了我遇到的问题,Chrome 会将日期转换为本地时区,而不是将其视为已经在本地时区。 @KingOfHypocrites — 这有点奇怪,因为调用 Date 构造函数 with a string 应该与使用 Date.parse 相同。【参考方案3】:我在这里发现了一件事。似乎本机 Firefox Inspector Console 可能存在错误: 如果我在本机检查器中运行“new Date()”,它会显示一个带有错误时区的日期,GMT 语言环境,但在 Firebug 扩展控制台中运行相同的命令,显示的日期使用我正确的时区 (GMT-3:00) .
【讨论】:
【参考方案4】:注意到 FireFox 没有返回与 Chrome 相同的结果。看起来您在 kendo.toString 中使用的日期格式有所不同。
最后一个控制台结果是我需要的:
【讨论】:
【参考方案5】:尝试使用 moment.js。它在所有浏览器中运行得非常好并且以类似的方式。带有许多格式化选项。使用 moment('date').format("") 而不是 New Date('date')
【讨论】:
以上是关于new Date() 在 Chrome 和 Firefox 中的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章