一、弄清几个概念:
1. 系统时钟(System Clock) 与 硬件时间(Read Time Clock ,简称RTC)
系统时间: 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
Linux中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。
2. UTC时间 与 本地时间(更多点击这)
UTC时间:Coordinated Universal 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
[xt@butbueatiful ~]$ date
Tue May 22 17:50:56 CST 2012
[xt@butbueatiful ~]$ date -u
Tue May 22 09:50:57 UTC 2012
设置系统时间
[xt@butbueatiful ~]$ date --set "05/22/12 18:09" (月/日/年 时:分:秒)
这个修改在系统重启后就失效了,因此为了将这个时间永久生效,需要将修改的时间写入CMOS。
看CMOS的时间:
[xt@butbueatiful ~]# clock –r
将当前系统时间写入CMOS中去
[xt@butbueatiful ~]# clock –w
2. 硬件时间 hwclock/clock
直接调用 /sbin/hwclock 显示的时间就是 BIOS 中的时间吗?未必!这要看 /etc/sysconfig/clock 中是否启用了UTC,如果启用了UTC(UTC=true),显示的其实是经过时区换算的时间而不是BIOS中真正的时间,如果加上 --localtime 选项,则得到的总是 BIOS 中实际的时间.
查看硬件时间:
[xt@butbueatiful ~]$ sudo hwclock
Tue 22 May 2012 06:17:49 PM CST -0.125565 seconds
或
[xt@butbueatiful ~]$ sudo hwclock --show
Tue 22 May 2012 06:18:08 PM CST -0.750363 seconds
或
[xt@butbueatiful ~]$ sudo clock --show
Tue 22 May 2012 06:19:05 PM CST -0.094241 seconds
设置硬件时间:
[xt@butbueatiful ~]$ sudo hwclock --set --date="05/22/12 18:20" (月/日/年 时:分:秒)
或
[xt@butbueatiful ~]$ sudo clock --set --date="05/22/12 18:20" (月/日/年 时:分:秒)
硬件时钟与系统时钟同步:
[xt@butbueatiful ~]$ sudo hwclock --hctosys(hc代表硬件时间,sys代表系统时间)
或者
[xt@butbueatiful ~]$ sudo clock --hctosys
系统时钟和硬件时钟同步:
[xt@butbueatiful ~]$ sudo hwclock --systohc
或者
[xt@butbueatiful ~]$ sudo clock --systohc
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,BIOS时间就是系统本地时间,而且注意这时执行 hwclock --utc 得到的结果感觉不对,因为这里我们已经禁用了UTC,而且也明显不符合“本地时间=UTC+时区”的关系。
5. 时区的设置
[xt@butbueatiful ~]$ 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命令,可以修改文件变更时区。
[xt@butbueatiful ~]$ vi /etc/sysconfig/clock
ZONE=Asia/Shanghai(查/usr/share/zoneinfo下面的文件)
UTC=false
ARC=false
[xt@butbueatiful ~]$ rm /etc/localtime
[xt@butbueatiful ~]$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
重新启动即可。
三、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时间的,于是手动的设置便被覆盖掉了。
阅读(1825) | 评论(0) | 转发(0) |