谈谈 Windows 与 Linux 双系统环境下的时间不同步问题

在 Windows 和 Linux 两个操作系统间切换时,会产生时间不同步的问题——从 Windows 系统切换到 Linux 系统时,时间会向后推 8 小时;而当从 Linux 系统切换回 Windows 系统的时候,时间又向前推了 8 小时。

因为旧电脑就经历过这个问题,所以我还是挺清楚这个问题的根源所在——Windows 读取主板存储的时间的时候,认为该时间是已经加上了时区偏移的本地时间;而 Linux 在读取主板存储的时间的时候,认为该时间是 UTC 时间,系统在显示时间时会再加上时区带来的偏移量,从而造成这 8 小时的时间错位。

对应的,解决方案也可以从两个系统上下手:让 Linux 将主板上的时间视为本地时间,或者让 Windows 将主板上的时间视为 UTC 时间。

如果对 Linux 系统下手,只需要执行这样一行命令:

timedatectl set-local-rtc 1 --adjust-system-clock

这时候再执行 timedatectl 检查配置,会显示 RTC in local TZ: yes,说明已经完成相应修改。不过也会警告你这样修改是有副作用的:

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.

在将主板时间视为本地时间后,一方面,对于实施夏令时的地区来说,系统底层并不会在夏令时开始时自动修正时间(毕竟主板也不知道什么时候夏令时开始,什么时候结束),夏令时的支持需要更高层次的软件来提供。当然国内现在是不实施夏令时的,因此不必担心这一问题。另一方面,在时区变化的时候,系统不会自动根据两时区间的时差更新时间,也需要外部干预来纠正。

如果在 Windows 下操作,则需要先关闭与互联网的时间同步。然后打开注册表编辑器,在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation 下新增 32 位值项 RealTimeIsUniversal,将该值设置为 1。

现在的问题是,为什么在处理主板时间时,Windows 与 Linux 选择了截然不同的道路?在微软的 The old new things 博客 上,我找到了答案。

一方面,是历史上兼容性的保留。在 Windows 95 之前的时代,Windows 还没有完全摆脱 DOS 系统,需要先启动 DOS 系统,再在这基础上启动 Windows。而 DOS 系统则将主板时间视作本地时间,因此 Windows 出于兼容性的考虑也采取了同样的方案,并保持至今。

另外一方面,是用户友好性的考虑。如果将主板时间视为 UTC 时间,如果在 BIOS 设置里直接修改时间,则 BIOS 设置值与 Windows 系统的显示值之间的差异会给用户造成迷惑。

如果放到现在,Windows 和 Linux 的道路,哪个是更好的呢?我认为 Linux 将主板时间视为 UTC 时间的做法似乎更好一些。UTC 时间不会因为夏令时和所处时区的变化而发生改变,如果将主板时间视为本地时间,因为夏令时等外部因素的缘故,就要相应修改主板时间,总感觉有一点奇怪。

Linux 系统下的警告我感觉挺有道理:在将主板时间视为本地时间后,操作系统的工作没有减轻多少,原来需要在 UTC 时间上加上偏移量,现在则需要在外部因素变化时及时修正主板时间,实现起来反而会更加麻烦,不可避免地就会出现奇怪的问题。

主板时间并不是不能修改,在联网校准的时候是有必要作出修正。但是计算机是一个很重视层次与抽象的东西,时区,夏令时这些因素似乎应该交由操作系统这一层级来处理,而非直接作用在主板上。毕竟操作系统掌握着更多的信息:每个时区与 UTC 之间的时间偏移量,夏令时的开始结束时间等等,在这些信息发生变化的时候也能通过网络或者用户配置及时更新。主板对这些都一无所知,它就担当起让时间不停流动下去的工作就行了。

当然 Linux 的做法造成的 BIOS 显示时间与系统显示时间不一样的问题也确实不太好办,用户在修改时间时还得心算时区偏移量,对用户素质提出了更高的要求。不过会用 BIOS 的都是有一定知识储备的用户了,只要在 BIOS 设置里做好必要的说明,想必大家也不会因此感到困惑吧。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据