UTC时间&本地时间(一)
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。
北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行:
Date: Thurs, 31 Dec 2009 09:42:22 +0800
说明信件的发送地的地方时间是二○○九年十二月三十一号,星期四,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800, 就是东八区时间)。电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午。
以这个电子邮件的发送时间为例,如果要把这个时间转化为UTC,可以使用一下公式:
UTC + 时区差 = 本地时间
时区差东为正,西为负。在此,把东八区时区差记为 +0800,
UTC + (+0800) = 本地(北京)时间 (1式)
UTC = 本地时间(北京时间))- 0800 (2式)
0942 - 0800 = 0142
即UTC时间是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是 0432 (凌晨四点三十二分),那么,UTC就是 0432 - 0800 = -0368,负号意味着是前一天, -0368 + 2400 = 2032,既前一天的晚上八点三十二分。
纽约的时区是西五区,比UTC落后五个小时,记为 -0500:
UTC + (-0500) = 纽约时间 (3式)
UTC = 纽约时间 + 0500 (4式)
把(2)式 与 (4)式相比较,
UTC = 北京时间 - 0800 = 纽约时间 + 0500 (5式)
即 北京时间 = 纽约时间 + 1300 (6式)
即北京时间领先纽约时间十三个小时,由(6) 式,
纽约时间 = 北京时间 - 1300 (7式)
在四月下旬,纽约又换用夏令时,又称为日光节约时,比标准纽约时间提前一个小时,实际成为西四区的标准时间,成为 -0400。
UTC + (-0400) = 纽约夏令时,套用以上公式,
北京时间 = 纽约夏令时 + 1200
纽约夏令时 = 北京时间 - 1200
在这些转换中,最重要的公式就是
UTC + 时区差 = 本地时间
时区差东为正,西为负。 例如,东八区(北京)是 +0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区是西六区,-0600,美国山地时区是西七区,-0700,太平洋时区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区是东一区,+0100,夏天变为+0200。
多数电子邮件程序,例如Outlook Express,在显示时间时,计算机程序把时间先转换成为本地时间再显示,例如,邮件的Date域为:
Date: Fri, 08 Nov 2002 09:42:22 +0800
Outlook Express在显示时就显示为:
Date: Thur, 07 Nov 2002 08:42:22 pm,把北京时间转换成为了纽约时间,而且把二十四小时格式的时间转换成为了十二小时的格式。当然,为了时间转换正确,发送方和接受方的计算机的时区都要设置正确,在这里,发送方的时区要正确地设为北京时区东八区,而我的时区要设为西五区。
UTC时间&本地时间(二)
首先我们了解一下时间的相关概念,以及之间的区别,需要了解的时间概念有:
本地时间(locale time)
格林威治时间(Greenwich Mean Time GMT)
时间协调时间 (Universal Time Coordinated UTC)
本地时间,显而易见不用解释了
先看看时间的标准:
(1)世界时
世界时是最早的时间标准。在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104。以此标准形成的时间系统,称为世界是,即 UT1。1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初子午线的时间便被称为世界时,即UT2,或称格林威治时间(GMT),是对地球转速周期性差异进行校正后的世界时。
(2)原子时
1967年,人们利用铯原子振荡周期极为规律的特性,研制出了高精度的原子时钟,将铯原子能级跃迁辐射9192631770周所经历的时间定为 1s。现在用的时间就是1971年10月定义的国际原子时,是通过世界上大约200多台原子钟进行对比后,再由国际度量衡局时间所进行数据处理,得出的统一的原子时,简称TAI。
(3)世界协调时
世界协调时是以地球自转为基础的时间标准。由于地球自转速度并不均匀,并非每天都是精确的86400原子s,因而导致了自转时间与世界时之间存在 18个月有1s的误差。为纠正这种误差,国际地球自转研究所根据地球自转的实际情况对格林威治时间进行增减闰s的调整,与国际度量衡局时间所联合向全世界发布标准时间,这就是所谓的世界协调时(UTC:Coordinatde Universal Time)。UTC的表示方式为:年(y)、月(m)、日(d)、时(h)、分(min)、秒(s),均用数字表示。
GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,地方时为本地时间,如北京为早上八点(东八区),UTC时间就为零点,UTC时间比北京时晚八小时,以此计算即可
通过上面的了解,我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。
而在我们平时工作当中看到的计算机日志里面写的时间大多数是用UTC时间来计算的,那么我们该怎么将UTC时间转化为本地时间便于查看日志,那么在作程序开发时又该怎么将本地时间转化为UTC时间呢?
下面就介绍一个简单而使用的工具,就是使用linux/unix命令date来进行本地时间和local时间的转化。
大家都知道,在计算机中看到的utc时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。
以我的FC9平台为例:
1.使用date命令获得本地时间
Mon Jan 5 21:06:48 CST 2009
2.将本地易理解的时间转化为UTC时间,使用date 命令,对该时间进行UTC格式化
date +%s -d "Mon Jan 5 21:06:48 CST 2009"
返回的结果是:1231160808 #自1970年1月1日0:00:00起到今天晚上21:06:48共1231160808秒
1231160808这就是我们所说的UTC或者格林威治时间。
3.使用命令date将难以理解的UTC时间转化成为容易理解的本地时间
在这里,我们随便将上面这个格林威治时间修改一下来进行转化即可,比如1231130828
date -d "1970-01-01 UTC 1231130828 sec"
返回结果是:Mon Jan 5 12:47:08 CST 2009 #是今天中午12:47:08
4.使用date命令将本地时间进行格式化
date +%X -d "Mon Jan 5 12:47:08 CST 2009"
返回结果:12:47:08 PM
date +%x +%X -d "Mon Jan 5 12:47:08 CST 2009"
返回结果是:01/05/2009 12:47:08 PM
date +'%x %X %W' -d "Mon Jan 5 12:47:08 CST 2009"
返回结果:01/05/2009 12:47:08 PM 01 #后面的01是星期一,如果是%w,返回的是1
date +'%Y-%m-%d %H:%M:%S %W' -d "Mon Jan 5 12:47:08 CST 2009"
返回结果是:2009-01-05 12:47:08 01
对UTC时间的进行格式化:
date +‘%x %X' -d "1970-01-01 UTC 1231130828 sec"
返回结果:01/05/2009 12:47:08 PM
date命令还有很多格式化的参数,功能很强大,大家可以使用"man date"或者"info date"来作参考。
对于windows的朋友没有linux环境,没有办法进行时间转化,推举一个网址可以作时间转化:
http://kanlis.7ta.cn/time.html
5. 设置当前时间
date -s 12:41:30
设置的时间,到底是UTC还是CST,要根据系统的设置而定,可在/etc/sysconfig/clock中查看。
6. 设置当前日期
date -s 12/31/09
遵循的格式是:月/日/年
7. 设置系统的时区
a. #timeconfig
键入该命令后,根据提示,选择你需要的时区;仅限于RedHat Linux 和 CentOS
b. #cp /usr/share/zoneinfo/UTC /etc/localtime
这样,就可以用UTC时间标准,代替当前的时区设置。
#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
用中国上海的时区,代替当前时区设置。
#cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
复制相应的时区文件,替换系统默认时区
c. #tzselect