浏览器之间的DST在旧日期上不匹配

时间:2019-04-11 00:33:22

标签: .net google-chrome firefox timezone momentjs

在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会计算出相同的答案。这些测试是在momentjs.com网站上从“ America / Denver”时区的计算机以及在“ America / Los_Angeles”时区的BrowserStack的计算机上完成的。

1 个答案:

答案 0 :(得分: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与美国其他地区进行DST观测。

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

如果您需要一致的历史时间,请使用moment-timezone而不是依赖浏览器的Date对象,如果您未指定时区,moment就会这样做。跨平台的不一致和各种版本的浏览器都在这里对您不利,因为Java不需要正确的行为。 (我认为.NET框架是错误的,但我对原因一无所知;请研究。)

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