问题描述
在双系统(arch linux + windows)环境下,从 linux 重启进入 windows 后,windows 系统时间会比实际时间慢 8 小时。反之亦然。
根本原因
两个操作系统对硬件时钟(rtc,real time clock)的时间标准处理方式不同:
| 操作系统 | 默认硬件时钟标准 |
|---|---|
| windows | 本地时间(localtime) |
| linux | utc(协调世界时) |
当你处于东八区(utc+8)时:
- linux 将硬件时钟存为 utc 时间,启动时加上 8 小时偏移显示为本地时间。
- windows 直接读取硬件时钟作为本地时间,不再加偏移。
因此,如果 linux 将硬件时钟写为 utc 时间(比如 12:00),windows 启动后直接当作本地时间读取,显示为 12:00,而实际本地时间应该是 20:00,差了正好 8 小时。
解决方案
方案一:让 windows 使用 utc(推荐)
修改 windows 注册表,让 windows 也把硬件时钟视为 utc。
方法 a:命令行(推荐)
以管理员身份打开 powershell 或命令提示符,执行:
reg add "hkey_local_machine\system\currentcontrolset\control\timezoneinformation" /v realtimeisuniversal /d 1 /t reg_dword /f
方法 b:注册表文件
创建一个文本文件,命名为 utc-time.reg,内容如下:
windows registry editor version 5.00 [hkey_local_machine\system\currentcontrolset\control\timezoneinformation] "realtimeisuniversal"=dword:00000001
双击该文件导入注册表。
方法 c:手动操作注册表编辑器
- 按
win + r,输入regedit,回车。 - 导航到路径:
hkey_local_machine\system\currentcontrolset\control\timezoneinformation - 在右侧空白区域右键 → 新建 → dword (32位) 值。
- 命名为
realtimeisuniversal。 - 双击该值,将数据设为
1(十六进制)。 - 重启 windows。
注意
- 重启后可能需要重新同步一次时间(windows 设置 → 时间和语言 → 日期和时间 → 立即同步)。
- 建议在 windows 中关闭自动时间同步,避免与 linux 端的 ntp 服务冲突。路径:设置 → 时间和语言 → 日期和时间 → 关闭"自动设置时间"。
- 如果 windows 要求因 dst(夏令时)更新时钟,可以允许,它只会修正显示时间,硬件时钟仍保持 utc。
方案二:让 arch linux 使用本地时间
在 arch linux 终端中执行:
sudo timedatectl set-local-rtc 1
验证设置是否生效:
timedatectl | grep local # 输出:rtc in local tz: yes
恢复为 utc
如果以后想恢复 linux 使用 utc:
sudo timedatectl set-local-rtc 0
注意事项
- 此方案在切换时区或夏令时调整时可能产生问题。
- systemd 从 v216 开始,当 rtc 设为本地时间时,不再自动将系统时间同步回硬件时钟,以避免干扰 windows。
- fat 文件系统的时间戳将被视为 utc。
推荐做法总结
| 方案 | 优点 | 缺点 |
|---|---|---|
| windows 使用 utc(推荐) | 符合国际标准,无夏令时问题,多时区友好 | 需要修改 windows 注册表(操作简单) |
| linux 使用 localtime | 操作简单,一行命令 | 夏令时、时区切换时可能出问题 |
推荐使用方案一,一劳永逸。
相关命令备忘
linux 端
# 查看当前时间和 rtc 状态 timedatectl # 查看 rtc 是否使用本地时间 timedatectl | grep local # 设置硬件时钟为 utc sudo timedatectl set-local-rtc 0 # 设置硬件时钟为本地时间 sudo timedatectl set-local-rtc 1 # 查看硬件时钟 sudo hwclock --show # 将系统时间写入硬件时钟 sudo hwclock --systohc # 设置时区(示例:上海) sudo timedatectl set-timezone asia/shanghai # 启用 ntp 时间同步 sudo timedatectl set-ntp true
windows 端
# 添加 utc 注册表键(管理员权限) reg add "hkey_local_machine\system\currentcontrolset\control\timezoneinformation" /v realtimeisuniversal /d 1 /t reg_dword /f # 删除 utc 注册表键(恢复默认) reg delete "hkey_local_machine\system\currentcontrolset\control\timezoneinformation" /v realtimeisuniversal /f # 强制同步时间 w32tm /resync
以上就是linux/windows双系统时间相差8小时问题解决方案的详细内容,更多关于linux/windows时间相差8小时的资料请关注代码网其它相关文章!
发表评论