我不知道为什么,但是在某些PC中,momentjs显示错误的时间。我不相信这是夏季夏令时造成的(在我国目前如此)。但是在少数几台PC上可以正确显示,而另一台PC可以相差1小时(例如此打印屏幕)。 显然,我测试的所有PC的配置都相同。
更新: 在新的检查中,我看到firefox x chrome显示了不同的时间。似乎问题出在Chrome中。
在Windows注册表上,值HKLM \ SYSTEM \ CurrentControlSet \ Control \ TimeZoneInformation为:
注册表中不存在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
。
答案 0 :(得分:2)
感谢您提供问题中的所有信息。不过,回想起来,这并不是真正的on topic for Stack Overflow,它可能更适合StackExchange网络中的SuperUser或ServerFault网站。不过,我想我可以解决您的问题:
主要原因是您写的内容:
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 blog或KB914387的“已发布的更新”部分中查看这些更新。如果您不了解最新信息,则可能会面临没有准确的时区信息的风险。而且,如果您按照此处所示删除时区注册表项,那么所有选择都将关闭。
还请注意,即使对于您本国以外的国家/地区来说,拥有当前时区信息也很重要。例如,也许您可能需要安排与另一个时区的人开会。如果您的计算机不是最新的时区数据更新,则您可能无法正确安排该会议。
在这一点上,我建议在撰写本文时安装KB4468323的最新时区更新(无论指示的国家是)。时区更新是累积性的,因此从理论上讲,安装此更新应可以还原丢失的注册表项并解决问题。
或者,也许更好,只需重新打开Windows Update。您可能还缺少许多更新。
答案 1 :(得分:0)
也许如果您使用moment()。isDST()并采取相应措施...