【问题标题】:DST not matching between browsers for old dates旧日期的浏览器之间的 DST 不匹配
【发布时间】:2019-09-01 12:48:41
【问题描述】:

在 Chrome、Firefox 和 Opera(在 Windows 10 和/或 Mac 上)中,运行 moment('1957-10-19').isDST() 会返回 false

在 Edge 和 IE11(在 Windows 上)和 Yandex(在 Windows 和 Mac 上)和 Safari(在 Mac 和 iPhone 上)中,相同的代码返回 true

在 C# .NET 中,new DateTime(1957, 10, 19).IsDaylightSavingTime() 返回 true

哪些是正确的?

有什么好的方法可以处理吗?

我在将此类日期从 C# 序列化为 JavaScript 时发现了这一点。因为服务器和客户端在日期是否为 DST 上不一致,所以日期提前了一个小时,即前一天晚上 11 点。

这不一定是 moment.js 问题,因为底层 JavaScript 计算得出相同的答案。这些测试是在“America/Denver”时区的计算机和 BrowserStack 中“America/Los_Angeles”时区的计算机上在 momentjs.com 网站上完成的。

【问题讨论】:

  • 这已经被问过几次了,但归结为 Windows 没有跟踪那么远的历史时区数据(因此应用了更新的规则),并且一些浏览器带有自己的时区数据。 (false 是正确的)。

标签: .net google-chrome firefox timezone momentjs


【解决方案1】:

zoneinfo 有 America/Denver 直到 1965 年才观察 DST。

https://github.com/eggert/tz/blob/2019a/northamerica#L455-L467

> moment.tz('1965-06-01','America/Denver').isDST()
true
> moment.tz('1964-06-01','America/Denver').isDST()
false

(使用 6 月 1 日来避免考虑过渡日期,过去美国各地并不统一。)

自 1918 年以来,America/Los_Angeles 与美国其他地区一起观察夏令时。

> moment.tz('1918-06-01','America/Los_Angeles').isDST()
true
> moment.tz('1917-06-01','America/Los_Angeles').isDST()
false

如果您需要一致的历史时间,请使用 moment-timezone 而不是依赖浏览器的 Date 对象,如果您不指定时区,moment 会这样做。跨平台的不一致和各种版本的浏览器在这里对你不利,因为 Javascript 不需要正确的行为。 (我想 .NET 框架是错误的,但我不知道为什么;请查看 。)

如果您需要将用户的当前时间转换为一些时区(这是一个猜测,您可能会猜到),请使用moment.tz.guess()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2013-09-19
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多