原因
一个概念:BIOS时间:系统的硬件时间。
时间不同步,原因非常简单:
windows认为,BIOS时间就是当地时间。所以windows会直接显示BIOS时间。
ubuntu认为,BIOS时间应当是UTC时间(格林尼治标准时间)。所以ubuntu会将BIOS时间加上8小时后再显示出来(在中国)。
所有的操作系统(不论是ubuntu还是windows)在启动后都会更新系统时间。流程如下:
1.电脑开机,读取BIOS时间并显示。(windows直接显示,ubuntu加8后再显示)
2.联网后,获取当地时间并显示。
3.更新BIOS时间。
联网后大家获取到的时间都是当地时间,这没问题。但ubuntu和windows在更新BIOS时间时,做法不同。windows获取到当地时间后,直接把BIOS时间设为当地时间;而ubuntu把BIOS时间设为UTC时间。比如现在是北京时间12点,UTC时间就是12-8=4点,ubuntu就会把BIOS时间设为4点。
案例
请您退出windows,进入ubuntu,在终端里输入一条指令,就可以验证上面的分析:
timedatectl status
这个指令用来查看系统时间状态。如果您的显示如下:
ricksteves@ricksteves-X405UA:~$ timedatectl status Local time: 四 2023-01-12 16:50:35 CST Universal time: 四 2023-01-12 08:50:35 UTC RTC time: 四 2023-01-12 08:50:36 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no
第一行,Local time=12点,是ubuntu联网获取到的当地时间。
第三行,RTC time=4点,是电脑的BIOS时间。可以看到,ubuntu把当地时间减去8小时,得到了UTC时间并赋给了BIOS。
最后一行,RTC in local TZ=no,这句话代表系统时间和BIOS时间不同步,即BIOS存储的是UTC时间,而系统时间是当地时间。
那么问题就来了,下次重启进入windows时,windows读到的BIOS时间是4点,而windows认为BIOS时间就是当地时间,所以就会直接显示4点。不过,windows也会联网,等他得到正确的12点后,他又会将BIOS设为12点,那么等你下次进ubuntu的时候,ubuntu又会把12点加上8,得到20点,再输出——如此循环,每次更换系统的时候显示的时间都不对。
解决方案
解决方案非常简单。直接在ubuntu终端中输入:
timedatectl set-local-rtc 1
这句话的作用是让ubuntu将系统时间和BIOS时间同步。现在,ubuntu和windows一样,都认为BIOS时间就是当地时间,联网更新时,也是直接将BIOS时间设为当地时间。这样就没问题了。
现在再输入timedatectl status查看系统时间状态:
root@ricksteves-X405UA:/home/ricksteves# timedatectl status Local time: 四 2023-01-12 16:54:27 CST Universal time: 四 2023-01-12 08:54:27 UTC RTC time: 四 2023-01-12 16:54:27 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: yes
第一行,Local time=12点。
第三行,RTC time=12点,即BIOS也被设为了12点。
最后一行,RTC in local TZ变为了yes。系统时间和BIOS时间完成同步。
弹出一个Warning,告诉你这种方法不太好,但我们为了同步两个系统的时间,也只能这么做了。
现在再重启进入windows,看到时间已经对了。