最近被分配到⼀个关于时间的bug,以前对什么UTC,GMT,local time总是⼀头雾⽔,转载⼀篇吧,现在终于明⽩了,呵呵 整个地球分为⼆⼗四时区,每个时区都有⾃⼰的本地时间。在国际⽆线电通信场合,为了统⼀起见,使⽤⼀个统⼀的时间,称为通⽤协调时(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:CoordinatdeUniversal 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:084.使⽤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,返回的是1date +'%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.html5. 设置当前时间date -s 12:41:30
设置的时间,到底是UTC还是CST,要根据系统的设置⽽定,可在/etc/sysconfig/clock中查看。6. 设置当前⽇期date -s 12/31/09遵循的格式是:⽉/⽇/年7. 设置系统的时区a. #timeconfig
键⼊该命令后,根据提⽰,选择你需要的时区;仅限于RedHat Linux 和 CentOSb. #cp /usr/share/zoneinfo/UTC /etc/localtime
这样,就可以⽤UTC时间标准,代替当前的时区设置。#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ⽤中国上海的时区,代替当前时区设置。
#cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime 复制相应的时区⽂件,替换系统默认时区c. #tzselect
因篇幅问题不能全部显示,请点此查看更多更全内容