用双系统 Windows 和 Ubuntu 的同学其实遇到过一个很有意思的问题,双系统时间不同步,从 Linux 切换回 Windows 后恰好慢了 8 个小时
其实这是因为 Windows 和 Linux 对硬件时钟(RTC)时间的解读方式不同。
我们的主板上会有一颗时钟芯片,存储着物理世界的时间,但
Windows 认为硬件时钟里存储的时间应该是本地时间(比如,你的时区是东八区,硬件时钟就应该是北京时间)。
Linux/Ubuntu 认为硬件时钟里存储的时间应该是 UTC(协调世界时)时间。
假设你的时区是 东八区(UTC+8,北京时间)。真实世界的时间是 北京时间(本地时间)下午 4 点(16:00),对应的 UTC 时间就是 上午 8 点(08:00)。
第一步:在 Windows 中#
1. 正在使用 Windows,系统时间正确显示为 16:00(下午 4 点)。
2.Windows 认为硬件时钟应该存储本地时间。所以,它会把 16:00 这个时间写入硬件时钟。
第二步:重启,进入 Ubuntu#
1. 启动电脑,进入 Ubuntu。
2.Ubuntu 去读取硬件时钟,它默认认为硬件时钟上存储的是 UTC 时间。于是它读到了 16:00。
3.Ubuntu 心想:“哦,硬件时钟上说 UTC 时间是 16:00。而我所在的时区是 UTC+8,那么本地时间应该是 UTC 时间加上 8 小时。”
4. 计算:16:00(它以为的 UTC) + 8 小时 = 第二天凌晨 00:00。
5.Ubuntu 自动通过互联网进行网络时间校准(NTP)。当系统启动联网后,它发现:“咦?我根据硬件时钟算出来的本地时间(00:00)和网络标准时间(16:00)对不上,差了 8 小时。”
于是,Ubuntu 做了一件聪明事:
- 它自动把系统时间纠正为了正确的网络时间(16:00)。
- 同时,为了保持未来的一致性,它用这个纠正后的 UTC 去更新硬件时钟。
- 此时,硬件时钟里的数字被 Ubuntu 从 16:00 改为了 08:00。
第三步:重启,切回 Windows(时间错误)#
再次重启电脑,回到 Windows。
- Windows 去读取硬件时钟,它依然认为硬件时钟上存储的是本地时间。于是它读到了 08:00。
- 当 Windows 无法在启动时自动联网校准时,则需要手动校准,因此直接把这个时间显示为本地时间上午 8 点。
此文由 Mix Space 同步更新至 xLog
原始链接为 https://fmcf.cc/notes/18