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

Moment JS showing 1 hour of difference in some 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, like 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

.

也许如果你使用 moment().isDST() 并采取相应的行动......

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

感谢您提供问题中的所有信息。不过,回想起来,这并不是 StackExchange 网络中的 on topic for Stack Overflow, and would probably fit better on the SuperUser or ServerFault 个站点。不过,我想我可以解决您的问题:

主要原因是你写的:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Times Zones doesn't exists on my Registry.

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

为什么你看到 Chrome 一个小时,是因为 Chrome 在内部使用 TimeZoneKeyName,然后试图在时区数据库中找到相应的条目。如果找到,则可以从那里使用动态 DST 来确保 JS Date object 在 year-over-year 更改方面的行为正确。

有趣的是,当 未找到 时(因为它已在您的计算机上删除),然后 Chrome 不应用当年 DST 信息在 存在于您的计算机上的键中。它只是假设没有夏令时。另一方面,当缺少时区数据库时,FireFox 似乎正在退回到使用当年 DST 信息。

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

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

特别是关于时区,了解变化是不可预测的。世界各国政府可以而且确实会更改其时区信息,有时是负责任的,有时是随意的。 Microsoft 跟踪此数据的更改并相应地为 Windows 生成更新。您可以在 the Microsoft TZ/DST blog, or in the "Updates that have been issued" section of KB914387 上查看这些更新。如果您不了解最新信息,那么您将面临无法获得准确时区信息的风险。如果您删除此处看到的时区注册表项,那么所有赌注都将取消。

另请注意,即使对于您所在国家/地区以外的国家/地区,了解当前时区信息也很重要。例如,您可能需要安排与另一个时区的人会面。如果您的计算机没有及时更新时区数据,那么您可能会错误地安排该会议。

此时,我建议安装最新的时区更新(无论指定的国家/地区如何),在撰写本文时为 KB4468323。时区更新是累积的,因此理论上安装此更新应该可以恢复丢失的注册表项并解决问题。

或者,也许更好,只需重新打开 Windows 更新。您可能还遗漏了很多很多更新。