Linux環境與Windows環境部署程序顯示的時間不一致

在項目上駐場研發時遇到一個問題,和Linux與Windows獲取時間相關的問題。
問題發生的背景是,一套使用tomcat部署的Java web程序,研發環境在Windows上,測試環境在Linux上。兩套程序代碼一致,連接同一套oracle數據庫。然而,在讀取數據庫中的數據時,訪問研發環境的程序頁面,顯示的時間數據是正確的。但是訪問測試環境的程序時,頁面顯示的時間是錯誤的,比研發環境的程序快了12小時。
當時第一反應是兩個環境的操作系統時間不一致,然而發現系統時間是一致的。後來想到Linux和Windows兩個系統對於時間的計算方式不同,Windows把系統硬件時間當作本地時間(local time),即操作系統中顯示的時間跟BIOS中顯示的時間是一樣的。而Linux把硬件時間當作 UTC,操作系統中顯示的時間是硬件時間經過換算得來的。後來想到,這種情況屬於在同一臺PC上的雙系統時間不一致的問題,而且就算是不一致也應該是相差8個小時。所以問題不在這裏,和同事討論並且搜索了各種材料之後,發現導致該問題發生的原因,應該是Linux的硬件時間和系統時間不一致的問題。
介紹一下Linux的硬件時間與系統時間。
系統時間: 一般說來就是我們執行 date 命令看到的時間,Linux系統下所有的時間調用(除了直接訪問硬件時間的命令)都是使用的這個時間。
硬件時間: 主板上BIOS中的時間,由主板電池供電來維持運行,系統開機時要讀取這個時間,並根據它來設定系統時間(注意:系統啓動時根據硬件時間設定系統時間的過程可能存在時區換算,這要視具體的系統及相關設置而定)。
通過date命令獲取系統時間,在用hwclock命令獲取硬件時間。結果如下:

硬件時間和系統時間正好相差12個小時。而系統時間纔是正確顯示的時間。想了想,自己前一天因爲發現系統時間快了12個小時,於是手動進行了修改。也並沒有重啓服務器。這裏造成了兩個後果,一是導致了系統時間與硬件時間不一致,另一個結果是,因爲JVM獲取時間的原理導致並不能獲取到正確的當前時間,因此導致了這個問題的發生。
於是使用以下命令將硬件時間與系統時間同步:
hwclock --systohc
之後重啓了tomcat,問題解決了。


在網上查閱的相關資料:
http://www.360doc.com/content/15/0112/16/15242507_440173299.shtml
http://www.cnblogs.com/shiweifu/archive/2010/12/16/1907653.html
http://blog.chinaunix.net/uid-182041-id-3464524.html
http://blog.csdn.net/velanjun/article/details/8213303
發佈了29 篇原創文章 · 獲贊 70 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章