问题根源

在使用Windows和Linux双系统时,会有一个很烦人的问题:

linux下设置时区正常时,win下时间会错位

win下同步时间时,linux下时间会错位

原因很简单,win认为主板时间(RTC)是本地时间(Local Time),linux认为主板时间是UTC时间

解决方案

除了每次打开系统时手动调整时间这种笨方法,有两个方案:

  • 让win认为主板时间是UTC

  • 让linux认为主板时间是本地时间

以POSIX制定的标准(Markus Kuhn)而言,更推荐的方式是调整win的注册表,让它采用和linux一样的行为

推荐方案:让win认为RTC是UTC

  • Win + R 输入 regedit 打开注册表编辑器

  • 导航到这个路径

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 
  • 新建DWORD (32-bit) 值,名称RealTimeIsUniversal ,值1

  • 重启win

不推荐的方案:让linux认为RTC是本地时间

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

但这样会有很多问题,因为大多数服务都是遵循POSIX标准的:

  • 违背 Linux 的 UTC 设计

  • 某些服务(如日志、Docker)会记录错误的时间

  • 和 cron、systemd-timers 配合可能出现“任务提前/延迟触发”