最新消息:

关于时间、时区、系统时间和硬件时间

IT技术 ipcpu 7009浏览

关于时间、时区、系统时间和硬件时间

时区(Time Zone)是地球上的区域使用同一个时间定义。
1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。

一、以下是一些术语的解释

格林威治标准时间 GMT
十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全 球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)的由来,标示在手表上,则代表此表具有两地时间功能,也就是同时可以显示原居地和另一个国度的时间。

世界协调时间 UTC
多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是 Coordinated Universal Time- 世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子 时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若 大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标 准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

夏日节约时间DST
所谓「夏日节约时间」Daylight Saving Time(简称D.S.T.),是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。 自此以后,全球以欧洲和北美为主的约70个国家都引用这个做法。

系统时间
一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。

硬件时间
主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。

世界时间
(Universal Time)世界标准时间即UTC。

地方时间
(本地时间,Local Time)由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是:
本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区

二. 在Linux中查看系统时间

  1. #date
  2. Fri Nov 7 23:21:34 CST 2014 //本地时间
  3. #date -R
  4. Fri, 07 Nov 2014 23:21:35 +0800 //本地时间,RFC2822格式
  5. #date -u
  6. Fri Nov 7 15:21:37 UTC 2014 //UTC时间

CST是什么意思?
其实CST有4中意思,所以这里显示CST是很容易被误解。
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

因此查看linux系统时间,我还是建议使用后两种方式。

如何去掉hwclock中显示的CST?
执行hwclock命令之前,添加环境变量"export LANG=C"

  1. #hwclock
  2. Sun 09 Nov 2014 07:38:25 PM CST -0.161066 seconds
  3. #export LANG=C
  4. #hwclock
  5. Sun Nov 9 19:38:35 2014 -0.813925 seconds

三. 在Linux中查看硬件时间(BIOS时间)

使用命令可以查看BIOS硬件时间:

  1. hwclock --localtime

但因为BIOS里面没有时区的设置,因此有两种时间设定方法。

UTC=yes 存储UTC时间
UTC=no 存储本地LOCAL时间

查看系统是否启用了UTC方法如下:

  1. UTC=false or UTC=true in file /etc/sysconfig/clock,RHEL5
  2. LOCAL or UTC in file/etc/adjtime,last line,RHEL6
  3. UTC=no or UTC=yes in file /etc/default/rcS,Debian6,Squeeze.
  4. LOCAL or UTC in file/etc/adjtime,last line,Debian7,Wheezy.(if not exist,excute hwclock --adjust)

若系统启用了UTC,则显示如下:

  1. # export LANG=C
  2. # tail -1 /etc/adjtime
  3. UTC
  4. date -R
  5. # date -R
  6. Sun, 09 Nov 2014 19:36:05 +0800
  7. hwclock
  8. # hwclock
  9. Sun Nov 9 19:36:06 2014 -0.031592 seconds
  10. # hwclock --localtime
  11. Sun Nov 9 11:36:07 2014 -0.672380 seconds //BIOS里面存的是UTC时间

若未启用UTC,则显示如下:

  1. #export LANG=C
  2. #tail -1 /etc/adjtime
  3. LOCAL
  4. #date -R
  5. Sun, 09 Nov 2014 19:32:12 +0800
  6. #hwclock
  7. Sun Nov 9 19:32:13 2014 -0.725862 seconds
  8. #hwclock --localtime
  9. Sun Nov 9 19:32:14 2014 -0.995411 seconds //BIOS里面存的是LOCAL本地时间

四、Windows和Linux双系统造成时间问题

有很多人安装了双系统Linux+Windows会发现其中一个系统时间不准。
这是因为Windows默认不使用UTC,需要将Linux中的UTC关闭。
当然网上有人修改windows的注册表将UTC打开,也是一样的,但我没试过。

五、改动UTC造成的问题

可能存在如下情况,

  1. 原系统设置是 "UTC=yes",重装了系统之后采用了"UTC=no"或者相反的操作。
  2. 将操作系统设置“UTC=yes”的磁盘,插入原先操作系统"UTC=no"的服务器并采用新插入盘启动。

这些情况都可能会导致时间不一致。

解决办法是用ntpdate同步网络时间,并写入硬件BIOS。

比较混乱的情况下还要指定把哪个时间写入BIOS(尚未测试)

  1. hwclock --systohc --localtime //将LOCAL时间写入BIOS。适用于UTC=no
  2. hwclock --systohc --utc //将UTC时间写入BIOS,适用于UTC=yes

六、参考文章

http://www.sealinger.com/archives/221/
http://hi.baidu.com/lujunqianglw/blog/item/bc2d9144d24fc48fb3b7dc1d.html
http://www.huawei.com.cn/ecommunity/bbs/10143547.html

来自为知笔记(Wiz)

转载请注明:IPCPU-网络之路 » 关于时间、时区、系统时间和硬件时间