Moment JS在某些PC上显示1小时的差异

时间:2018-12-07 19:18:31

标签: javascript datetime timezone momentjs localtime

我不知道为什么,但是在某些PC中,momentjs显示错误的时间。我不相信这是夏季夏令时造成的(在我国目前如此)。但是在少数几台PC上可以正确显示,而另一台PC可以相差1小时(例如此打印屏幕)。 显然,我测试的所有PC的配置都相同。

momentJS website

更新: 在新的检查中,我看到firefox x chrome显示了不同的时间。似乎问题出在Chrome中。

Chrome x Firefox Time

在Windows注册表上,值HKLM \ SYSTEM \ CurrentControlSet \ Control \ TimeZoneInformation为:

regedit print

注册表中不存在HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Times区域。

Chrome navigator.userAgent:Mozilla / 5.0(Windows NT 6.1; Win64; x64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 71.0.3578.80 Safari / 537.36

Firefox navigator.userAgent:Mozilla / 5.0(Windows NT 6.1; Win64; x64; rv:63.0)Gecko / 20100101 Firefox / 63.0

2 个答案:

答案 0 :(得分:2)

感谢您提供问题中的所有信息。不过,回想起来,这并不是真正的on topic for Stack Overflow,它可能更适合StackExchange网络中的SuperUserServerFault网站。不过,我想我可以解决您的问题:

主要原因是您写的内容:

  

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Times Zones在我的注册表中不存在。

这意味着出于某种原因,也许是由于其他软件或系统管理员,非常重要的密钥已被删除。该特定键是Windows时区数据库的根,并且包含“动态DST”信息-允许DST的开始和结束每年不同。它可以使时区列表出现在控制面板中以供选择。如果确实不存在此密钥,则该列表应显示为空。

为什么看到Chrome休息一个小时,是因为Chrome内部正在使用TimeZoneKeyName,然后试图在时区数据库中找到相应的条目。如果找到了它,则可以从那里使用Dynamic DST来确保JS Date对象在逐年变化方面表现正确。

有趣的部分是找不到 (因为它已在您的计算机上删除),那么Chrome不会应用所在键中的当年DST信息< / em>出现在您的计算机上。它只是假设没有DST。另一方面,当缺少时区数据库时,FireFox似乎回退以使用当年DST信息。

无论哪种方式,您都在处理未记录的行为,因为删除密钥是您计算机的不合理状态。还有很多其他事情不一定能正常工作(例如,与其他时区的人安排Outlook会议)。

此外,从注册表的屏幕截图中可以看出,DaylightStart值是2017年的值,那时DST将于10月在巴西开始。它现在从11月开始,因此00 00 0a 00应该在该值的开头为00 00 0b 00。此更改是在Windows中使用KB4093753进行的,您的计算机上似乎没有该更改。这告诉我Windows Updates不在这些计算机上运行。  也许您的管理员正在手动选择要安装的更新,或者根本没有更新。

特别要注意时区,了解变化是不可预测的。世界各地的政府都可以并且确实会更改时区信息,有时是负责任的,有时是偶然的。 Microsoft跟踪对此数据的更改,并相应地为Windows生成更新。您可以在the Microsoft TZ/DST blogKB914387的“已发布的更新”部分中查看这些更新。如果您不了解最新信息,则可能会面临没有准确的时区信息的风险。而且,如果您按照此处所示删除时区注册表项,那么所有选择都将关闭。

还请注意,即使对于您本国以外的国家/地区来说,拥有当前时区信息也很重要。例如,也许您可​​能需要安排与另一个时区的人开会。如果您的计算机不是最新的时区数据更新,则您可能无法正确安排该会议。

在这一点上,我建议在撰写本文时安装KB4468323的最新时区更新(无论指示的国家是)。时区更新是累积性的,因此从理论上讲,安装此更新应可以还原丢失的注册表项并解决问题。

或者,也许更好,只需重新打开Windows Update。您可能还缺少许多更新。

答案 1 :(得分:0)

也许如果您使用moment()。isDST()并采取相应措施...

http://momentjs.com/docs/#/query/is-daylight-saving-time/