google-chrome - Windows 10 上 chrome/edge 之间的时差

标签 google-chrome timezone microsoft-edge

我发现 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 位)

最佳答案

这确实是一个错误。

TZ Database shows:

# 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

Windows Registry

我用绿色突出显示的最后部分是 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 却犯了错误。

Chrome Screenshot

我还测试了 FireFox,它似乎也出现了错误:

FireFox Screenshot

我还可以在 Node.js 中重现这些结果。

但是,Edge 的做法是正确的:

Edge Screenshot

请注意,浏览器在调整本地时间的方向上也有所不同,本地时间落入由向前过渡所产生的“间隙”中。这是预期的,并且是 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/

相关文章:

html - CSS Box 阴影不会出现在 Chrome 中

c# - 使用 nodatime 如何找到两个 ZonedDateTime 对象之间的区别

java网络启动时间

powershell - 如何在 powershell 中找到 Windows 10 上的 Microsoft Edge 版本?

javascript - Microsoft Edge 弹出扩展如何获取背景页面?

python - 如何修复 "Unknown error: Chrome failed to start: exited abnormally"以在 docker 中运行 chrome?

windows - 无法读取您的偏好

html - 带有水平子菜单的水平菜单栏在 IE 中不起作用

c# - 如何在 ASP.net 应用程序中结合日期时间和时区偏移量?

html - 加载 PNG 时出现 MS Edge SEC7117 错误