双系统时间同步问题
在装完 Linux 和 Windows 两个系统可能会注意到这两个操作系统之间存在时间差异,一般是相差 自定义时区 的偏移量,比如在中国就是相差 8 个小时。
但是不必担心,这是一个很常见的问题,可以在 Linux 终端中使用这个命令修复这个问题
成因解析¶
出现这种情况的原因是 Windows 和 Linux 它们在默认情况下看待硬件时间的方式是不一样的。
计算机有两个主要时间:系统时间 (SC) 和硬件时间 (RTC)。
时间概念
在操作系统中看到的时间。
实时时间或 CMOS/BIOS 时间。在计算机领域作为硬件时间的简称。该时间不是位于操作系统,而是在计算机主板上,即使系统关闭后它仍会继续运行。
格林尼治标准时间,也就是世界时。GMT 以地球自转为基础的时间计量系统,但由于地球自转不均匀导致 GMT 不精确,现在已经不再作为世界标准时间使用。
协调世界时。UTC 是以原子时秒长为基础,在时刻上尽量接近于 GMT 的一种时间计量系统。为确保 UTC 与 GMT 相差不会超过 0.9 秒,在有需要的情况下会在 UTC 内加上正或负闰秒。UTC 现在作为世界标准时间使用。
当计算机开机时,首先会读取硬件时间并用于设置系统时间。之后,系统时间用于跟踪时间。如果操作系统对系统时间进行任何更改,例如更改时区等,它会尝试将此信息同步到硬件时间中。
但默认情况下,Linux 会认为硬件时间中存储的时间是 UTC 时间,而不是本地时间,但 Windows 认为硬件时间上存储的时间是本地时间,这就是问题所在。
举个例子¶
我现在位于东八区 (UTC +08:00),于是我将 Linux 的时区也设置为东八区,同时 Linux 会将此时间信息同步到硬件时间中,但东八区的时间偏移量为 08:00 小时,由于 Linux 的硬件时间 (RTC) 必须采用 UTC,于是戏剧性的一幕就发生了,硬件时间存储的就是偏移前的时间。
也就是说假设东八区的当前时间是 15:00,这意味着 UTC 时间是 07:00。
这时启动 Windows,硬件时间为 UTC 时间,即 07:00 。但 Windows 认为硬件时间已经存储了本地时间,所以它会更改系统时间并使用 UTC 时间作为本地时间。因此 Windows 将 07:00 显示为比实际时间晚 8:00 小时的时间。
解决问题¶
知道了原因,那解决这个问题的方式就简单了,一共有三种解决方案:
让 Linux 和 Windows 通过互联网自动检查日期、时间和时区。¶
如果系统皆连接到互联网,它会自动设置正确的时间。比如要使 Ubuntu 系统自动检查日期和时间,就可以到 设置(Settings) -> 系统(System) -> 日期和时间(Date & Time)
启用 自动设置日期和时间(Automatic Date & Time)
和 自动设置时区(Automatic Time Zone)
这两个选项,Windows 类似。
让 Linux 使用本地时间作为硬件时间。¶
也就是文章开篇说的方法,因为在 Linux 中进行更改更容易,Ubuntu 和大多数其他 Linux 发行版现在都使用 systemd,因此可以使用 timedatectl
命令来更改设置。
其实就是告诉 Linux 系统使用本地时间作为硬件时间 (RTC)。可以使用 set-local-rtc
(设置 RTC 的本地时间)选项来执行此操作:sudo timedatectl set-local-rtc 1
让 Windows 使用 UTC 时间作为硬件时间。¶
same