If you’re using dual-boot Windows alongside a Linux distribution (like Fedora, Ubuntu, etc.), you’ve probably encountered that frustrating issue where the clock shows the wrong time after switching from one OS to the other. It drove me crazy! This post is a quick reminder for my future self (and maybe you!) on why this happens and the best way I found to fix it permanently.
The Root Cause: A Tale of Two Time Standards
The heart of the problem lies in how Windows and Linux, by default, interpret the time stored in your computer’s Hardware Clock (also known as the RTC or CMOS clock). This is the clock that keeps running even when your PC is off, thanks to that little battery on the motherboard.
- Windows: Assumes the time stored in the Hardware Clock is Local Time – the actual time on the clock in your specific time zone (e.g., Eastern Daylight Time, Pacific Standard Time), including adjustments for Daylight Saving Time (DST).
- Linux (most distros): Assumes the time stored in the Hardware Clock is Coordinated Universal Time (UTC) – the global time standard that doesn’t change with time zones or DST. Linux then calculates your correct local time based on UTC plus your selected time zone settings.
When you switch operating systems, they read the Hardware Clock based on their own assumption. One OS might then “correct” the Hardware Clock according to its standard, making it wrong for the other OS when you boot into it next. This back-and-forth causes the time drift.
The Fix: Tell Windows the Hardware Clock is UTC
The most robust solution is to make Windows adopt the same standard as Linux: interpreting the Hardware Clock as UTC. This requires a simple change in the Windows Registry.
Why this method is generally preferred:
- It aligns both operating systems with a universal standard (UTC).
- UTC doesn’t have ambiguities related to Daylight Saving Time transitions, making it more reliable for the base hardware clock time.
Here are the steps:
- Boot into Windows.
- Open Registry Editor: Press
Win + R
, typeregedit
, and hit Enter. You’ll likely need to approve the User Account Control (UAC) prompt by clicking “Yes”.- Standard Warning: Be careful when editing the registry. Incorrect changes can cause system instability. Stick precisely to these instructions.
- Navigate to the Key: In the left-hand pane of the Registry Editor, navigate to this specific location:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
(Expand
HKEY_LOCAL_MACHINE
, thenSYSTEM
,CurrentControlSet
,Control
, and finally click onTimeZoneInformation
). - Create the DWORD Value:
- In the right-hand pane (showing the values within
TimeZoneInformation
), right-click on an empty space. - Select
New
->DWORD (32-bit) Value
. - Crucial: Even if you are using 64-bit Windows, you must select
DWORD (32-bit) Value
. - Name this new value exactly:
RealTimeIsUniversal
- In the right-hand pane (showing the values within
- Set the Value Data:
- Double-click the
RealTimeIsUniversal
value you just created. - In the “Value data” box, type
1
. - Ensure the “Base” is set to
Hexadecimal
(though it makes no difference for the value 1). - Click
OK
.
- Double-click the
- Close Registry Editor.
- Reboot Your Computer: The change takes effect after a restart.