Windows 10 改為使用 UTC 時間

語言: CN / TW / HK

優麒麟(Ubuntu Kylin )和視窗(Windows)雙系統,存在一個問題:

從一個系統切換到另一個系統後,時間就會出錯,表現為——

時差8小時。

例如:

  • 優麒麟中時間正常,但是切換回 Windows 後,後者的時間慢8個小時。
  • Windows 中時間正常,但是切換回優麒麟後,後者的時間快8個小時。

一個系統中時間錯亂,尚可通過網際網路時間同步(NTP伺服器)來解決。但是切換到另一個系統後,時差問題照樣如故。

為什麼會出現時差?

在瞭解時差出現的原因之前,我們先了解以下幾個時鐘的概念:

系統時間 / 本地時間(System time / Local time)

指 Linux 系統內部的時間。我們在系統工作列中能直接看到的時間就是系統時間。

實時時鐘(Real-Time Clock, RTC)

實時時鐘是 PC 主機板上的晶振及相關電路組成的時鐘電路的生成脈衝,它控制著計算機系統的時間。作業系統中所提到的 RTC,指的就是在計算機主機板控制下的時間,即系統時間,為計算機硬體的內部時鐘。

協調世界時(Coordinated Universal Time, UTC)

協調世界時(英語:Coordinated Universal Time,法語:Temps Universel Coordonné,簡稱UTC)是最主要的世界時間標準,其以原子時秒長為基礎,在時刻上儘量接近於格林尼治標準時間。

——以上描述摘自維基百科

實踐中,UTC 與 GMT 大致重合,其時間的值基本一致,但是它們在本質上各不相同。前者以原子時為依據,是確定時間值的標準,而後者則是時區上的概念,作為世界上不同地區人口生活的時間參照。

UTC也是計算機系統中的一個時間衡量標準,優麒麟預設就將機器時間視為UTC。16.04 及更高版本的時間管理工具timedatectl中,UTC 時間被單獨列出來.

CST

CST同時是以下兩個時區的英文縮寫:

  • 中國標準時間:China Standard Time
  • 中部標準時間(美國):Central Standard Time

如此縮寫相同,在沒有明確區分的情況下極易混淆,例如,筆者在小米Max上使用date命令檢視時區時,輸出以下結果:

$ date
Tue Sep  4 16:51:00 CST 2018

timedatectl工具的輸出也不會那麼明智。如果不知道這兩個時區縮寫相同,我還真以為系統拿美國的 CST 作為時區參照,使得這裡的CST指的是美國標準時間了。幸好,為了避免歧義,優麒麟的時區設定介面中特別標明瞭當前時區相對 UTC 的時差。

格林尼治標準時間(Greenwich Mean Time, GMT)

格林尼治平時(英語:Greenwich Mean Time,GMT)是指位於英國倫敦郊區的皇家格林尼治天文臺當地的平太陽時,因為本初子午線被定義為通過那裡的經線。

——以上描述摘自維基百科

為什麼時差剛好是 8 個小時?

在中國,雙系統導致的時差不多不少,正好是 8 個小時。而這 8 個小時的時差,正是中國所在時區東八區(GMT+8)相對於 GMT 的時間差。UTC 正與 GMT 重合,加上其又是優麒麟系統的時間依據(優麒麟認為機器時間是 UTC),因此對於時區設定為東八區的中國使用者來說,這 8 個小時,不多不少,“剛剛好”。

解決方案

時間不同步的問題,已經是Ubuntu使用上的一個經典問題了,很多前輩都給出瞭解決辦法。

方法一:在 Windows 中設定

推薦使用這個方法。開啟管理員模式的命令提示符或PowerShell(在Windows+X快捷選單中),輸入以下命令:

reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

原理就是:在登錄檔項HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation中新增一個名為RealTimeIsUniversal的值,型別為REG_DWORD,資料為1。此項的作用就是讓Windows將硬體時間當作UTC,與Ubuntu的預設設定一致。

重啟系統後即可生效。

方法二:優麒麟中的設定

不推薦使用這個方法。需要注意的是,優麒麟會自動設定時區和時間,此時如果不進行後續的設定,機器時間就會被改寫。本地時間(Local Time)就是我們在系統中使用的時間,它的值雖然正確,但這是以 UTC 為參照的,與機器時間存在 8 小時的時差。一旦重啟進入仍然將機器時間視為 RTC 的 Windows,則必會導致時間不統一。

自 16.04 版本起,timedatectl成為時間管理工具。不帶引數執行時,它會輸出當前的時間,以及系統時間的一些配置引數。

以下為設定前的timedatectl輸出,本地時間為筆者的實際時間,注意觀察時差:

                      Local time: Fri 2018-09-07 22:32:18 CST
                  Universal time: Fri 2018-09-07 14:32:18 UTC
                        RTC time: Fri 2018-09-07 14:32:18
                       Time zone: Asia/Shanghai (CST, +0800)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no

具體的操作如下:

第一步:更改硬體時間標準。為了讓優麒麟能正確顯示時間,需要執行以下命令,將硬體時間由 UTC 改為 CST。設定完成後,重啟電腦生效:

sudo timedatectl set-local-rtc 1

這裡要注意的是,優麒麟官方其實是不推薦如此設定的。再次執行timedatectl,你會發現輸出的下方多了一段很長的警告,還加粗了:

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.

不過這一警告我們不必理會,畢竟電腦上共存的是兩套構造完全不同的系統。

第二步:同步本地時間。聯網開啟“設定”→“詳細資訊”→“日期和時間”,開啟前兩個選項(“自動設定時間”和“自動設定日期”),稍等片刻。

第三步:同步機器時間。執行以下命令,將本地時間更新到硬體時間上:

最終設定的結果如下,注意觀察時差:

                      Local time: Fri 2018-09-07 23:15:47 CST
                  Universal time: Fri 2018-09-07 15:15:47 UTC
                        RTC time: Fri 2018-09-07 23:15:47
                       Time zone: Asia/Shanghai (CST, +0800)
       System clock synchronized: no
systemd-timesyncd.service active: yes
                 RTC in local TZ: yes

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
sudo hwclock --localtime --systohc 

總結

採用上述方法,可完美解決優麒麟 16.04 及以上版本與 Windows 共存時所造成的時差問題,而時差問題的根源就在於預設情況下兩個作業系統對待硬體時間的標準不一致。預設地,優麒麟會將硬體時間視為 UTC,而 Windows 則將其視為本地時間。

注意事項

切勿在兩個系統中同時設定

上述兩種系統的方法不能同時適用,否則會導致兩款系統的時間標準不統一。因為在Ubuntu中,我們是要把預設的機器時間標準從 UTC 改動出去,但在Windows 中卻剛好相反。時間標準不統一,造成的後果與適用本教程前一模一樣,只是錯亂的系統變成了 Windows。

同時,若在時間標準不統一的情況下設定系統時間,還會連同硬體時間也一同產生時差,提前或延後八個小時。

參考文獻

《經驗體會:解決Ubuntu 18.04+Windows雙系統時間不同步的問題》, https://www.jianshu.com/p/cf445a2c55e8
分享到: