BIOS時間與系統時間(windows/linux時間同步問題)


寫作動機

  雙系統是不少人喜歡的方式,但安裝雙系統之后一般會出現兩個系統時間不一樣的問題,剛開始用雙系統的時候也沒怎么在意,就是裝上后在網上找找相關解決方法,復制粘貼代碼完事兒。但是次數多了就有點煩了,每次都這樣搞問題倒是解決了但是不知道原理。

  最近幾次發現解決方法發生了改變,和之前的方法不一樣了,於是打算一探究竟。如果你想了解原理請仔細閱讀,句句都是重點。

  注意:以下並沒有解決問題的實際代碼,因為本文章是講原理的!

術語解釋

  設備上的時間:一是系統時間(Local time),一是硬件時間(RTC)。系統時間指操作系統的時間,可以認為就是我們看到的時間;硬件時間指 BIOS 中的時間,這里不解釋 BIOS 是啥了(你可以認為是和操作系統同時且獨立運行的另一個系統)。也就是說這倆可以有自己的不同的時間。

  真實的時間:世界統一時間(UTC),本地時間(中國=CST/UTC+8)。世界統一時間指地球上所有時間都以一個地方的時間為基准,本地時間指在不同的地區根據世界時間作調整。具體怎么個算法不懂的自己去搜。

問題產生原因

  真實世界的時間不會出現問題,當我們知道中國處於東八區時世界時間就和本地時間綁定了,有 [本地時間=世界時間+8] 。

  系統時間和硬件時間就可能出現問題,系統時間雖然可以從網絡同步,但在未聯網時也需要顯示時間啊,所以操作系統啟動時需要讀取硬件時間(BIOS中的時間一直在自同步)。

  問題就在於這兩個系統對硬件時間的看法不一樣 : ) 。Windows 認為硬件時間是本地時間,也就是取出來直接顯示就對了;而 Linux 則認為硬件時間是世界時間,取出來再根據時區進行 "+8" 操作之后再顯示才對。

  根據以上描述可以推斷,雙系統設備中的 Linux 系統時間將比 Windows 系統中的時間快八小時。

  另外如果你的設備上並不是這種情況,請根據以上原理自行查找原因,並可參考如下所述的解決方案自行操作。

兩大主流解法

  一為修改 Linux 系統中的標准

    較早版本中通過修改配置文件,新版本中通過 "timedatectl" 進行控制,最終結果其實也是形成了一個配置文件,以便在以后系統取時間時使用正確的算法。

    其它文檔說這個版本界限在Ubuntu中是 16.04 ,請自測。

  一為修改 Windows 系統中的標准

    通過修改一個注冊表參數來控制其系統時間,原理應該也是和 Linux 系統中一樣的吧。

  這兩種修改方法都可以使兩個系統顯示的時間是本地時間,其原理是統一這兩個系統對於硬件時間的認知標准。

  我不建議修改 Windows 的配置文件,不是我認為 Windows 的標准是對的,而是覺得 Linux 更適合折騰。

偏門解法

  在查這個問題的時候發現了一些有意思的解法,其中有一個是修改系統中的時區。

  比如 Linux 系統中使用了 [世界時間+8] 來計算顯示錯誤,那么是因為其認為這里是 "UTC+8" 所以應該顯示 [世界時間+8] 之后的時間;解決方案是設置 Linux 中時區為 "+0" 的時區,那么顯示結果為 [世界時間+0]。恕我直言,這解法真是......太可愛了 0.0

  按照上述解法的思維,我也可以先在 Linux 系統同步時間至正確,然后再將 Windows 系統的時區設置為 "+16" 的時區,也可以使兩個系統都顯示正確,可能因為實際沒有 "+16" 的時區,不然還真有這種解法呢。

一些思考

  操作系統啟動后都需要去讀取硬件時間,但硬件時間到底應該是世界時間還是本地時間呢?這個要真要有個能說了算的那一定是 BIOS 的創造者了,不過估計當時可能也沒考慮到這個問題,畢竟時間這個東西也不是 BIOS 的主要功能,至於現在不同操作系統能否統一標准也不是我能說了算的......

  另外其實任何系統都完全有能力解決這個問題,但不知道為啥都視而不見

  這里斗膽建議一下 Linux 系統下可用的解決方案:

    一可在系統安裝(假設Linux后安裝)時,時區選擇后讓用戶確認真實時間是 [硬件時間] 還是 [硬件時間+時區] ,再根據選擇修改配置文件

    二可在系統已經完成安裝的情況下,當用戶多次手動校准時間(手動設置或網絡校准)時,計算校准前后時間差是否和時區值基本相等,以此判斷硬件時間是否是本地時間

最后

  知識還是那么些知識,其它技術文檔里基本都能找到,我只是用自己的思維重新表述一下,一來做個筆記,再者希望可以幫助到別人

  原創文章,轉發請注明

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM