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

标签 javascript datetime timezone momentjs localtime

我不知道为什么,但在某些电脑上,momentjs 显示的时间是错误的。我相信这是由夏令时造成的(目前在我国)。但在一些电脑上显示正确,而在其他电脑上则有 1 小时的差异(就像这个打印屏幕)。 显然我测试的所有电脑的配置都是相同的。

momentJS website

更新: 在新的检查中,我看到 Firefox x chrome 显示的时间不同。看来问题仅出在 Chrome 中。

Chrome x Firefox Time

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

regedit print

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

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

.

最佳答案

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

主要原因是你写的:

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

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

为什么您看到 Chrome 关闭了一小时,是因为 Chrome 在内部获取 TimeZoneKeyName,然后尝试在时区数据库中查找相应的条目。如果找到,则可以使用动态 DST 来确保 JS Date 对象在逐年变化方面表现正确。

有趣的是,当它找不到(因为它已在您的计算机上删除)时,Chrome 就不会应用所在<的键中的当前年份 DST 信息/em> 存在于您的计算机上。它只是假设没有夏令时。另一方面,当时区数据库丢失时,FireFox 似乎会回退到使用当前年份的 DST 信息。

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

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

特别是关于时区,请了解变化是不可预测的。世界各地的各国政府都可以而且确实改变了他们的时区信息,有时是负责任的,有时是随意的。 Microsoft 跟踪此数据的更改并相应地为 Windows 生成更新。您可以在 the Microsoft TZ/DST blog 上查看这些更新,或在 KB914387 的“已发布的更新”部分中。如果您不及时了解最新信息,则您可能无法获得准确的时区信息。如果您删除了此处所示的时区注册表项,那么一切都将失败。

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

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

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

关于javascript - Moment JS 在某些 PC 上显示出 1 小时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53675594/

相关文章:

javascript - 在 Prop 中传递对象时避免重新渲染 child

c# - Xamarin 'iOS Foundation NSDate to C# DateTime conversion' 反之亦然不考虑夏令时

java - 时区转换期间的奇怪行为

timezone - ICS 时区不工作

javascript - 从文件夹中提取所有图像并创建 Bootstrap 轮播/幻灯片

javascript - 如果将脚本动态添加到 DOM, "async"属性/属性是否有用?

bash - 在 bash 中创建将运行特定时间的 while 循环

Javascript equlivent 到 .Net TimeZoneInfo.ConvertTimeBySystemTimeZoneId

oracle - 带时区的 hibernate 时间戳

javascript - FormType 未在 Dynamics CRM 2016 上返回正确的值