inux时间问题两篇
?轉自:http://hi.baidu.com/lujunqianglw/blog/item/bc2d9144d24fc48fb3b7dc1d.html
(一)
一、首先要弄清幾個概念:
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小時)。
二、時間命令
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.×××17 seconds
可見,如果不使用UTC,BIOS時間(紅色部分)就是系統本地時間,而且注意這時執行 hwclock --utc 得到的結果沒有任何意義,因為這里我們已經禁用了UTC,而且也明顯不符合“本地時間=UTC+時區”的關系。
三、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硬件體系。
1、date
查看系統時間
# date
設置系統時間
# date --set “07/07/06 10:19" (月/日/年 時:分:秒)
2、hwclock/clock
查看硬件時間
# hwclock --show
或者
# clock --show
設置硬件時間
# hwclock --set --date="07/07/06 10:19" (月/日/年 時:分:秒)
或者
# clock --set --date="07/07/06 10:19" (月/日/年 時:分:秒)
3、硬件時間和系統時間的同步
按照前面的說法,重新啟動系統,硬件時間會讀取系統時間,實現同步,但是在不重新啟動的時候,需要用hwclock或clock命令實現同步。
硬件時鐘與系統時鐘同步:
# hwclock --hctosys(hc代表硬件時間,sys代表系統時間)
或者
# clock --hctosys
系統時鐘和硬件時鐘同步:
# hwclock --systohc
或者
# clock --systohc
4、時區的設置
# 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
重新啟動即可。
轉載于:https://blog.51cto.com/newzk/584136
總結
以上是生活随笔為你收集整理的inux时间问题两篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直接定址表03 - 零基础入门学习汇编语
- 下一篇: API 2.0Switching Bas