我发现 Windows 10 上 Chrome 和 Edge 之间存在 TZ 差异。 当我在控制台中运行此代码时:
> var date = new Date(2013, 2, 29, 1, 0, 0, 0);
> date
这将是在 Edge 上运行时的输出
> [date] Fri Mar 29 2013 01:00:00 GMT+0200 (Jerusalem Standard Time)
这将是 Chrome 上的输出:
> [date] Fri Mar 29 2013 01:00:00 GMT+0300 (Jerusalem Daylight Time)
似乎在 Chrome 中它被识别为 DST,但在 Edge 中则不然,这是正确的。
(Attached screenshot)
如果我关闭“自动调整夏令时”配置 - Chrome 日期会变得相同。 (image2)
谁能解释一下为什么?以及如何在任何“日期和时间”配置中在 Chrome 中获取正确的 TZ?
边缘版本:20.10240.16384.0 Chrome 版本:56.0.2924.75(64 位)
最佳答案
这确实是一个错误。
# As of 2013, DST starts at 02:00 on the Friday before the last Sunday
# in March. DST ends at 02:00 on the last Sunday of October.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D
Rule Zion 2013 max - Oct lastSun 2:00 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Jerusalem 2:20:54 - LMT 1880
2:20:40 - JMT 1918 # Jerusalem Mean Time?
2:00 Zion I%sT
因此,2013 年夏令时应该在 3 月最后一个星期日之前的星期五开始,即 3 月 29 日。(上一个星期五是 3 月 22 日,不符合 Fri>=23
时区数据中的规则。) This is date is also corroborated by timeanddate.com .
Windows 的数据似乎是正确的。检查注册表:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Israel Standard Time\Dynamic DST
我用绿色突出显示的最后部分是 DST 开始日期。
00 00 = Year (ignored)
03 00 = Month (March)
05 00 = Day of week (Friday)
05 00 = Day number (5 = last)
02 00 = Hour (02:00)
00 00 = Minute
00 00 = Second
00 00 = Millisecond
因此 Windows 和 IANA 数据都指向同一日期。然而不知何故,Chrome 却犯了错误。
我还测试了 FireFox,它似乎也出现了错误:
我还可以在 Node.js 中重现这些结果。
但是,Edge 的做法是正确的:
请注意,浏览器在调整本地时间的方向上也有所不同,本地时间落入由向前过渡所产生的“间隙”中。这是预期的,并且是 is being worked on in for a future version the of ECMAScript spec 。
我没有研究这些浏览器中的实际实现,但我的理解是 Chrome、Node 和 FireFox 的时区内部都依赖 ICU。 我的猜测是,这是这里暴露的 ICU 错误。 更新:这似乎是 Microsoft 中的错误C/C++ 运行时。我正在努力将其交给合适的人。
至于该怎么办 - 如果准确的历史时区数据对您的应用程序至关重要,我强烈建议您不要依赖环境来提供它,而是使用我列出的库之一自己带来 here ,例如 moment-timezone(我帮助维护)。
关于google-chrome - Windows 10 上 chrome/edge 之间的时差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967837/