一、總結一下hwclock,這個容易暈:
1)/etc/sysconfig/clock 文件,只對 hwclock 命令有效,且只在系統啓動和關閉的時候纔有用(修改了其中的 UTC=true 到 UTC=false 的先後,執行 hwclock (--utc, 或 --localtime) 都沒有變化,要重啓系統後才生效);
2)/etc/rc.d/rc.sysinit 文件,run once at boot time,其中有從硬件時鐘同步時間到系統時間的操做; html
3)hwclock --localtime 的輸出,纔是硬件時鐘真正的時間。若是輸出結果帶時區(好比CST),還要看/etc/sysconfig/clock裏的UTC參數,若是 UTC=false,那時區有意義;若是 UTC=true,那時區沒意義,其實是UTC時間。 linux
4)在 /etc/sysconfig/clock 中 UTC=false 時,date、hwclock、hwclcok --localtime 輸出的時間應該都一致,且此時 hwclock --utc是沒有意義的; windows
5)在 /etc/sysconfig/clock 中 UTC=ture 時,date、hwclock 的輸出是一致的,hwclock --localtime 的輸出則是UTC時間; ide
6)若是不想在輸出中帶時區,則 export LANG=C ,而後再運行 hwclock 就沒有什麼CST了,省得時區誤導你; 函數
7)hwclock --utc 很鬧騰,仍是別看了,你會暈的。。。 ui
8)系統關閉時會同步系統時間到硬件時鐘,系統啓動時會從硬件時鐘讀取時間更新到系統,這2個步驟都要根據 /etc/sysconfig/clock 文件中UTC的參數來設置時區轉換。 spa
二、實際案例分析:修改了 /etc/sysconfig/clock 中UTC參數但系統未正常關閉的狀況
修改 /etc/sysconfig/clock 文件後,若是系統內核忽然崩潰,而後直接按電源重啓,則系統沒有進行 系統時間到硬件時鐘的 同步;可是 系統啓動時,又根據 /etc/sysconfig/clock 中UTC的參數,來同步硬件時鐘到系統,這時就會出現時間問題:
0)假設系統的時區爲CST(UTC+8);
1)假設原 /etc/sysconfig/clock 中 UTC=true,修改爲 UTC=false;
2)若是此時系統未正常關機,系統時間未按參數 UTC=false 同步時間到硬件時鐘(沒有+8小時);
3)但系統被按電源重啓後,系統讀取到 UTC=false,認爲硬件時鐘爲CST時間,直接用於系統時間;
4)那麼此時,系統時間將少了8小時。 code
======================================================= orm
[引用]linux時間問題兩篇[zz]
2010年07月19日 星期一 上午 09:43
http://hi.baidu.com/lujunqianglw/blog/item/bc2d9144d24fc48fb3b7dc1d.html htm
(一)
1、首先要弄清幾個概念:
1. 「系統時間」與「硬件時間」
系統時間: 通常說來就是咱們執行 date 命令看到的時間,linux系統下全部的時間調用(除了直接訪問硬件時間的命令)都是使用的這個時間。
硬件時間: 主板上BIOS中的時間,由主板電池供電來維持運行,系統開機時要讀取這個時間,並根據它來設定系統時間(注意:系統啓動時根據硬件時間設定系統時間的過程可能存在時區換算,這要視具體的系統及相關設置而定)。
2. 「UTC時間」與「本地時間」
UTC時間:Coordinated Universal 8 e2 i( H7 t0 ^/ ^Time 世界協調時間(又稱世界標準時間、世界統一時間),在通常精度要求下,它與GMT(Greenwich Mean Time,格林威治標準時間)是同樣的,其實也就是說 GMT≈UTC,但 UTC 是以原子鐘校準的,更精確。
本地時間:因爲處在不一樣的時區,本地時間通常與UTC是不一樣的,換算方法就是
本地時間 = UTC + 時區 或 UTC = 本地時間 - 時區
時區東爲正,西爲負,例如在中國,本地時間都使用北京時間,在linux上顯示就是 CST(China Standard Time,中國標準時,注意美國的中部標準時Central Standard Time也縮寫爲CST,與這裏的CST不是一回事!),時區爲東八區,也就是 +8 區,因此 CST=UTC+(+8小時) 或 UTC=CST-(+8小時)。
2、時間命令
1. 系統時間 date
直接調用 date,獲得的是本地時間。若是想獲得UTC時間的話,使用 date -u。
[12-01 19:07> ~]$ date
2009年 12月 07日 星期一 14:22:20 CST
[12-01 19:07> ~]$ date -u
2009年 12月 07日 星期一 06:22:22 UTC
2. 硬件時間 /sbin/hwclock
直接調用 /sbin/hwclock 顯示的時間就是 BIOS 中的時間嗎?未必!這要看 /etc/sysconfig/clock 中是否啓用了UTC,若是啓用了UTC(UTC=true),顯示的實際上是通過時區換算的時間而不是BIOS中真正的時間,若是加上 --localtime 選項,則獲得的老是 BIOS 中實際的時間.
[12-01 19:07> ~]# hwclock
2009年12月07日 星期一 14時28分43秒 -0.611463 seconds
[12-01 19:07> ~]# hwclock --utc
2009年12月07日 星期一 14時28分46秒 -0.594189 seconds
[12-01 19:07> ~]# hwclock --localtime
2009年12月07日 星期一 06時28分50秒 -0.063875 seconds
3. /etc/localtime
這個文件用來設置系統的時區,將 /usr/share/zoneinfo/ 中相應文件拷貝到/etc下並重命名爲 localtime 便可修改時區設置,並且這種修改對 date 命令是及時生效的。不管是 date 仍是 hwclock 都會用到這個文件,會根據這個文件的時區設置來進行UTC和本地之間之間的換算。
4. /etc/sysconfig/clock
這個文件只對 hwclock 有效,並且彷佛是隻在系統啓動和關閉的時候纔有用,好比修改了其中的 UTC=true 到 UTC=false 的先後,執行 hwclock (--utc, 或 --localtime) 都沒有變化,要重啓系統後才生效。注:若是設置 UTC=false 並重啓系統後,執行一些命令結果以下:
date 2009年 12月 07日 星期一 19:26:29 CST
date -u 2009年 12月 07日 星期一 11:26:29 UTC
hwclock 2009年12月07日 星期一 19時26分30秒 -0.442668 seconds
hwclock --utc 2009年12月08日 星期二 03時26分31秒 -0.999091 seconds
hwclock --localtime 2009年12月07日 星期一 19時26分32秒 -0.999217 seconds
可見,若是不使用UTC,BIOS時間(紅色部分)就是系統本地時間,並且注意這時執行 hwclock --utc 獲得的結果沒有任何意義,由於這裏咱們已經禁用了UTC,並且也明顯不符合「本地時間=UTC+時區」的關係。
3、linux與windows雙系統間的時間同步
系統啓動和關閉時,硬件時間與系統時間之間的同步有兩種方式(假設在中國,用CST表明本地時間):
方式A: 使用UTC(對linux就是 /etc/sysconfig/clock 中 UTC=true)
開機: BIOS------->UTC(將BIOS中的時間當作是UTC)------(時區變化)----->CST
關機: CST -------(時區變化)----->UTC-------存儲到------>BIOS
方式B: 不使用UTC(對linux就是 /etc/sysconfig/clock 中 UTC=false)
開機: BIOS--------------------->CST(將BIOS中的時間當作是CST)
關機: CST ---------存儲到------>BIOS
經過設定 /etc/sysconfig/clock,linux能夠支持這兩種方式,然而windows只支持方式B(至少是默認支持B,而我不知道怎麼能讓它支 持A),那麼在雙系統狀況下,若是linux設成A方式,那麼在linux與windows系統切換時必定會形成時間混亂的,解決辦法就是將linux中 的UTC禁用,也設成B方式就能夠了。
注:能夠經過 hwclock --hctosys 來利用硬件時間來設置系統時間(注意不是簡單的複製BIOS中的時間爲系統時間,要看是否使用UTC,若是使用的話則要作時區換算),經過 hwclock --systohc 來根據系統時間設置硬件時間(也要看是否啓用UTC來決定是否作時區換算)。
總 之,不論使用 --systohc 仍是 --hctosys,同步後直接運行不帶參數的 hwclock 獲得的時間與直接運行 date 獲得的時間應該一致,這個時間是否就是BIOS中的時間(hwclock --localtime)那就不必定了,若是啓用了UTC就不是,沒啓用UTC就是。
並且還要注意:在系統中手動使用 hwclock hwclock --set --date='yyyy-mm-dd' 來設置BIOS時間只在系統運行時有效,由於當系統關閉時,還會按設定好的方式根據系統時間來重設BIOS時間的,因而手動的設置便被覆蓋掉了。
---------------------------------------------------------------------
(二)
Linux時鐘分爲系統時鐘(System Clock)和硬件(Real Time Clock,簡稱RTC)時鐘。系統時鐘是指當前Linux Kernel中的時鐘,而硬件時鐘則是主板上由電池供電的時鐘,這個硬件時鐘能夠在BIOS中進行設置。當Linux啓動時,硬件時鐘會去讀取系統時鐘的 設置,而後系統時鐘就會獨立於硬件運做。
Linux中的全部命令(包括函數)都是採用的系統時鐘設置。在Linux中,用於時鐘查 看和設置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只用一個就行,只不過clock命令除了支持 x86硬件體系外,還支持Alpha硬件體系。
一、date
查看系統時間
# date
設置系統時間
# date --set 「07/07/06 10:19" (月/日/年 時:分:秒)
二、hwclock/clock
查看硬件時間
# hwclock --show
或者
# clock --show
設置硬件時間
# hwclock --set --date="07/07/06 10:19" (月/日/年 時:分:秒)
或者
# clock --set --date="07/07/06 10:19" (月/日/年 時:分:秒)
三、硬件時間和系統時間的同步
按照前面的說法,從新啓動系統,硬件時間會讀取系統時間,實現同步,可是在不從新啓動的時候,須要用hwclock或clock命令實現同步。
硬件時鐘與系統時鐘同步:
# hwclock --hctosys(hc表明硬件時間,sys表明系統時間)
或者
# clock --hctosys
系統時鐘和硬件時鐘同步:
# hwclock --systohc
或者
# clock --systohc
四、時區的設置 tzselect
# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 輸入5,亞洲
Please select a country.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 輸入9,中國
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang
3) central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
4) Tibet & most of Xinjiang Uyghur
5) southwest Xinjiang Uyghur
#? 輸入1,北京時間
The following information has been given:
China
east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Fri Jul 7 10:32:18 CST 2006.
Universal Time is now: Fri Jul 7 02:32:18 UTC 2006.
Is the above information OK?
1) Yes
2) No
#? 輸入1,確認
若是不用tzselect命令,能夠修改文件變動時區。
# vi /etc/sysconfig/clock ZONE=Asia/Shanghai(查/usr/share/zoneinfo下面的文件) UTC=false ARC=false # rm /etc/localtime # ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 從新啓動便可。