双系统中的时钟时间不准确。

双系统 Windows XP Pro 和 Ubuntu 12.04。

我已经将 BIOS 设置为正确的时间,Ubuntu 设置为美国东部时间。Ubuntu 启动后,时间会误差 4 小时。如果我在 Ubuntu 中修正时间,那么当我启动 Windows XP 时,时间会误差 4 小时。

这是一个全新安装的 12.04 版本。在重新安装 Ubuntu 之前,我没有遇到这个问题。

6个回答

https://help.ubuntu.com/community/UbuntuTime#Multiple_Boot_Systems_Time_Conflicts

多重启动系统的时间冲突
操作系统将时间存储和检索到位于主板上的硬件时钟中,以便即使在系统没有电源时也能跟踪时间。大多数操作系统(Linux/Unix/Mac)默认将时间存储在硬件时钟上作为UTC,而某些系统(尤其是Microsoft Windows)将时间存储在硬件时钟上作为“本地”时间。这会在双重启动系统中引起问题,如果两个系统以不同方式查看硬件时钟。
将硬件时钟设置为UTC的优点是,在时区之间移动或夏令时(DST)开始或结束时,您无需更改硬件时钟,因为UTC不具有DST或时区偏移。
将Linux更改为使用本地时间比将Windows更改为使用UTC更容易和可靠,因此双启动Linux/Windows系统倾向于使用本地时间。
自Intrepid(8.10)以来,默认值为UTC=yes。
让Windows使用UTC
注意:最初不支持在Windows Vista和Server 2008上进行此方法,但随后在Vista SP2、Windows 7、Server 2008 R2和Windows 8/8.1中重新支持。
要使MS Windows从硬件时钟计算时间为UTC,请创建一个名为WindowsTimeFixUTC.reg的文件,其中包含以下内容,然后双击该文件以将内容与注册表合并:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "RealTimeIsUniversal"=dword:00000001
注意:无论上述注册表设置如何,Windows Time服务仍会在关闭时将本地时间写入RTC,因此如果在Windows中仍需要时间同步,请使用以下命令禁用Windows Time服务(如果需要在Windows中使用任何第三方时间同步解决方案):
sc config w32time start= disabled
撤销更改
您可以创建一个包含以下内容的文件,然后双击它以合并原始更改,如上所述:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "RealTimeIsUniversal"=-
如果已禁用Windows Time服务,请使用以下命令重新启用它:
sc config w32time start= demand
让Linux使用“本地”时间
告诉您的Ubuntu系统硬件时钟设置为“本地”时间:
Ubuntu 15.04之前的系统(例如Ubuntu 14.04 LTS):
编辑/etc/default/rcS
添加或更改以下部分
# Set UTC=yes if your hardware clock is set to UTC (GMT) UTC=no
Ubuntu 15.04及以上的系统(例如Ubuntu 16.04 LTS):
打开终端并执行以下命令
timedatectl set-local-rtc 1

84哦,天啊。我真是无法相信他们竟然愚蠢到在硬件时钟上使用本地时间。为什么你会这样做呢?永远也不应该这样啊! - iono
32@twome 因为在 MS-DOS 的早期阶段,网络交流并不发达,而且很少有人会将个人电脑搬迁到不同的时区。尽管考虑到这段历史,这仍然不是一个明智的决定。 - Jon Hanna
13@twome 尽管我同意您关于硬件时钟保持为Universal的看法,因为它不保存时区信息,但是这会带来一些问题:A)BIOS / UEFI具有各种功能,比如自动唤醒/睡眠定时器,在其中设置触发时间。对于普通用户而言,在UTC中设置这些时间可能很奇怪。B)正如Jon上面所说,出于向后兼容性的原因。 - Gelmir
12在Windows PowerShell中运行以下命令来更新上述提到的注册表属性:New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation -Name RealTimeIsUniversal -PropertyType DWord -Value 00000001 - Anatoly Mironov
1当我尝试在Win7中更改注册表设置时,出现了以下错误信息:“无法导入[key]:并非所有数据都成功写入注册表。某些键正在被系统或其他进程占用。”于是我在Ubuntu中进行了更改。 - pileofrocks
到目前为止,我一直通过运行(作为管理员)一个批处理文件来解决这个问题,以更新时钟: https://gist.github.com/thedom85/dbeb58627adfb3d5c3af - mathandy
这里被点赞的评论批评微软使用本地时间的决定让我担心,是否有什么原因我不应该将Ubuntu设置为使用本地时间呢? - mathandy
18对于那些只是匆匆浏览文本的人来说,你只需要在其中一个操作系统中更改设置,而不是两个都要改。 - Alexander Revo
在Ubuntu 18.04上运行 timedatectl set-local-rtc 1 对我没有帮助。我需要重新启动吗?我的意思是屏幕顶部的时钟仍然不准确。 - cryanbhu
1对我有效的只有注册表修复,而不是sc命令(适用于Windows 10)。Linux Mint没有发生变化。 - Sony Santos
我有同样的问题,但我注意到BIOS显示的时间与Windows 10显示的时间不一致(只有在之前启动过Linux后才会出现这个问题)。我尝试更改BIOS时间,但每次返回时都是错误的时间... - Panagiss
请注意,'info timedatectl'明确警告不要这样做。"请注意,将RTC保持在本地时区并不完全支持,并且会在时区更改和夏令时调整方面产生各种问题。如果可能的话,请将RTC保持在UTC模式下。" - Die in Sente
这会立即改变时间吗?在使用Windows 10后,我的时间差了一个小时,但是timedatectl set-local-rtc 1或timedatectl set-local-rtc 0没有任何区别。 - Kvothe
1这个混乱的原因是"历史原因"。MS-DOS设计仅使用BIOS时钟,甚至不理解时区或夏令时的概念。Windows 3.11必须与相同的文件系统兼容,因此它也使用本地时间。当引入Windows 95和NT时,它们通常与MS-DOS一起在双启动系统中使用,并且也必须兼容。而Windows 11仍然希望与之前的Windows版本链兼容,直到MS-DOS。转换为UEFI将是一个明确的修复方法,但是英特尔未能在那里实施修复,所以UEFI时间也是本地时间。 - Mikko Rantalainen
对于Windows 10,禁用Windows时间的命令应该是Set-Service -Name "W32Time" -Status stopped -StartupType disabled - undefined

要在基于systemd的版本(15.04及以上)中将BIOS时钟设置为本地时间而不是UTC时间,您需要使用timedatectl命令。根据Arch Wiki的说明:

You can set the hardware clock time standard through the command line. You can check what you have set to use by:

$ timedatectl | grep local

The hardware clock can be queried and set with the timedatectl command. To change the hardware clock time standard to localtime, use:

# timedatectl set-local-rtc 1

If you want to revert to the hardware clock being in UTC, do:

# timedatectl set-local-rtc 0

5在Ubuntu 16.10上,执行"hwclock --systohc --localtime"命令可以解决问题。这会将"本地时间"写入/etc/adjtime文件中,从而使其永久生效。 - user1050755
3@user1050755 这是在 timedatectl 命令之前、之后还是取代它使用的? - nasch
对我来说,只有在Antix-Core-22上使用hwclock --systohc --localtime命令才有效!之后,我在BIOS上修改了时钟,嘿! - Pedro Siqueira

你的时区是东部时区,目前是EDT(东部夏令时)。EDT比协调世界时(UTC)晚四个小时,与你所经历的偏移量相同。

当在双系统启动时发生这种情况时,通常是因为一个操作系统认为硬件时钟跟踪本地时间,而另一个操作系统认为硬件时钟跟踪UTC。

在你的情况下,你的硬件时钟可能设置为本地时间,并且:

  • Windows设置为使用本地时间,这(根据你的时间设置)是正确的
  • Ubuntu设置为使用UTC,这(根据你的时间设置)是不正确的

如果你只是在Ubuntu系统中重新设置时间,无论是手动还是自动,那么在Windows中时间将会错误,所以这不是一个好的解决方案。

相反,最好的解决方案可能是重新配置Ubuntu将硬件时钟时间视为本地时间(这样你就可以保持Windows配置和硬件时钟时间不变)。
要做到这一点,请以root身份编辑/etc/default/rcS,并确保其中有UTC=no。
按下Alt+F2
输入gksu gedit /etc/default/rcS并按下Enter
你可能会看到这样的内容:
# assume that the BIOS clock is set to UTC time (recommended)
UTC=yes

如果是这样,将UTC=yes改为UTC=no。(或者你可能想添加一条注释,比如将其改为UTC=no # changed to accommodate Windows system。在#字符后面的所有内容都是注释,只是为了让你的设置更易读。)
如果没有找到UTC=行,请查找任何未被注释(即开头没有#)的UTC=行,并相应地进行更改。如果已经被注释,请删除前面的#并确保它显示为UTC=no
保存文件并退出文本编辑器。
重新启动以应用更改,并检查两个操作系统上的时间是否正常工作。

来源:https://help.ubuntu.com/community/UbuntuTime#Make_Linux_use_.27Local.27_time

(但这只是一个很普遍的问题;我写这个答案是为了特别适用于你的情况,这是一个比较常见的问题。)


请注意,这种情况也可能发生在从一个 Ubuntu 版本升级到下一个版本的时候,就像我遇到的那样。我建议您执行上述修复步骤,并手动同步您的时钟,就像这个答案中所示(同时调整以适应 systemd):http://askubuntu.com/a/254846/139735 - starbeamrainbowlabs
我个人认为这应该是被接受的答案。我之前安装并运行了Windows,一切都很正常,然后我安装了Ubuntu,时钟就出现了问题 - 我看不出为什么我要修改Windows的设置,明显是Linux的添加破坏了我的配置。 - Przemek D
1@PrzemekD 这有点武断。我之前安装了Linux,运行得很好,然后我安装了Windows,时钟就乱了。它们对硬件时钟应该是本地时间还是UTC时间存在分歧。 - Ullallulloo
@Ullallulloo 你可能是对的,我一直以来都是Windows用户,所以从Windows为中心的角度来看。 - Przemek D

/etc/rcS修复在我的Win7 / Ubuntu 14.04x64安装上没有起作用,通过时钟GUI也没有任何修复方法。问题的根源是BIOS时间与UTC时间不一致,而Windows在使用UTC时非常麻烦。因此,我选择了一个使用UTC+0(BIOS和UTC时间之间没有变化)的地点。
尝试将您的位置更改为雷克雅未克(冰岛首都)。哇!您的Ubuntu时间将会与您的BIOS时间相匹配。

哈哈!太棒了。😄 我真的不在乎我的位置。这只是两秒钟的解决办法。非常感谢。 - Ravindra S
1这只是起作用的,但改变时区并不是正确的解决方案。请检查其他答案。 - logoff

每次我启动Linux或Windows时,两者之间有1小时的差异。这是因为一个使用的是UTC时间,另一个使用的是RTC时间。

为了修复我的 Ubuntu 20.04,我使用了以下方法:

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

在我的情况下,回到协调世界时(UTC)是可以的。
timedatectl set-local-rtc 0 --adjust-system-clock

如果你想检查你正在使用的内容,可以输入以下命令:timedatectl

谢谢!这个答案确实提供了其他答案没有提供的关键选项。 - denis.peplin

enter image description here

我们可以要求Windows在每次重启时与网络同步时间:
  1. 从开始菜单中搜索“服务”。
  2. 找到“Windows Time”。
  3. 将“启动类型”设置为“自动”。在我的情况下,时间会在登录Windows后大约10秒钟后更新。
在Ubuntu上,我们可以在设置中设置“自动日期和时间”,默认情况下它会在每次重启时自动运行。
这是我最喜欢的方法,因为它不需要修改注册表或设置Linux使用“本地”时间,这可能会导致夏令时同步等副作用。
有关更多参考,请参阅this answerthis answer

1这个问题的关键在于,您的日志会在启动和同步之间存在错误的时间,因为每次更换操作系统都会改变 BIOS 时间。这可能会导致应用程序出现问题。 - rtaft