在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的计算机上完成的。
答案 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框架是错误的,但我对原因一无所知;请研究nodatime。)
如果您需要将用户的当前时间转换为 some 时区(您可能会猜到这是一个猜测),请使用moment.tz.guess()
。