时区,GMT时间,UTC时间,UNIX时间戳

时间:2022-01-10 02:37:48

秒是一个时间基本单位。一天24小时,一小时60分,一分钟60秒,这来自于秒的定义——1秒的时间间隔为平均太阳日[1]的1⁄86400。到了20世纪中叶,人们发现地球自转的时间并不是恒定的,于是在1956年改以地球绕太阳轨道公转一周的时间来定义秒[2]。1967年,改用原子共振频率来定义秒[3],并在此基础上制作出了原子钟。目前,原子钟是世界上已知最准确的时间测量和频率标准。

GMT时间

格林尼治平时(Greenwich Mean Time,GMT),又称为格林尼治标准时间。
格林尼治平时的正午是指当平太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。

在http协议中规定,所有时间都要转换为GMT时间[4],例如date: Sat, 19 May 2018 17:17:24 GMT

UT时间

世界时(Universal Time,UT),是一种以格林尼治子夜起算的平太阳时。
由于1925年以前人们在天文观测中,常常把每天的起始(0时)定为正午,而不是通常民用的午夜,给格林尼治平时的意义造成含糊,人们使用世界时一词来明确表示每天从午夜开始的格林尼治平时。

时区

时区是指地球上的某一个区域使用同一个时间定义。GMT时间或者UT时间,都是表示地球自转速率的一种形式。从太阳升起到太阳落下,时刻从0到24变化。这样,不同经度的地方时间自然会不相同。为了解决这个问题,人们把地球按经度划分为不同的区域,每个区域内使用同一个时间定义,相邻的区域时间差为1个小时。时区又分为理论时区和法定时区。

理论时区

按经度,每15°为一个时区,将地球划分为24个时区,以本初子午线为中心,向东西两侧各延伸7.5°的区域为0时区。

法定时区

法定时区是在理论时区的基础上,根据某些地区的国界线做了调整之后的时区。为实际使用的时区。例如中国横跨东五区到东九区五个时区,但统一使用东八区时间(北京时间)。

时差

某个地方的时刻与0时区的时刻差称为时差,时差东正西负。以本初子午线为中心,每向东一跨过一个时区,时刻增加一个小时,每向西跨过一个时区,时刻减少一个小时。

如何理解向东时区增加
由于地球是自西向东转,在地球的某一个地方观察,东边的时间比西边的时间早(东边的人们先看到太阳升起)。
想象一下某一个时刻,太阳在你的正上空,此时你所在的地点的时间为正午12点。这时住在你东边的人们,他们看到太阳已经在西边了,他们的时刻是下午,所以往东,时刻增加。

国际日期变更线

大体以180度经线为日界线。当自西向东穿过日期变更线时,日期需要减少一天,反之,日期增加一天。

UTC时间

协调世界时(Coordinated Universal Time)。是主要的世界时间标准,以原子钟所定义的秒长为基础,在时刻上尽量接近GMT时间。UTC时间认为一个太阳日总是86400秒。在大多数情况下,UTC时间能与GMT时间互换。

UTC与时区

本初子午线所在的时区的时间后面加上字符Z,表示UTC时间。Z即为0时区的标志,读做Zulu。例如09:30 UTC就写作0930Z14:45:15 UTC则为14:45:15Z144515Z

UTC偏移量

UTC偏移量用以下形式表示: ±[hh]:[mm]±[hh][mm]、或者±[hh]。例如UTC时间为09:30z,此时北京时间就是1730 +0800,纽约时间是0430 -0500
UTC时间表示的格式一般为Sat, 20 May 2018 12:45:57 +0800表示东八区(北京时间)2018年5月20号 12:45:57星期六。

UTC时间与本地时间的转换。

UTC时间 + 时差 = 本地时间

例如:

  1. UTC时间2018-05-20 09:30:00 UTC,UTC+0800(北京)2018-05-20 17:30:00 +8000,UTC-0500(纽约)2018-05-20 04:30:00 -0500
  2. UTC时间2018-05-20 01:30:00 UTC,UTC+0530(印度)2018-05-20 07:00:00 +0530,UTC-1000(夏威夷)2018-05-19 15:30:00 -1000

闰秒

闰秒是在协调世界时(UTC)中增加或减少一秒,使得UTC时与原子时[5]之间的差不超过0.9秒。
需要闰秒的部分原因是因为一个太阳日并不总是86400秒。当要增加正闰秒时,这一秒是增加在第二天的00:00:00之前,效果是延缓UTC第二天的开始。当天23:59:59的下一秒被记为23:59:60,然后才是第二天的00:00:00。如果是负闰秒的话,23:59:58的下一秒就是第二天的00:00:00了,但目前还没有负闰秒调整的需求。
最近的一次添加闰秒是在2016年12月31日23:59:60。

UNIX时间

UNIX时间,或称POSIX时间是UNIX或类UNIX系统使用的时间表示方式。一般定义为从协调世界时(UTC时间)1970年1月1日0时0分0秒起至现在的总秒数。考虑到闰秒的话,更精确的定义为从协调世界时(UTC时间)1970年1月1日0时0分0秒起至现在经过闰秒调整之后的总秒数。

UNIX时间戳与闰秒

由于闰秒的存在,当有调整闰秒发生时,某个Unix时间戳可能表示两个时刻。但是闰秒的调整并没有一定的规律,这就会导致在用unix时间戳来计算时间间隔时不准确。计算机通过网络时间协议(Network Time Protocol,NTP)来接收闰秒调整的消息。

这篇博客说明了这个问题并给出了一个有意思的建议链接

[1] 平均太阳日是人们根据观察加上人为调整后,得出的时间单位,一个平均太阳日是固定的24个小时。
[2] 1960. 自历书时1900年1月1日12时起算的回归年的31,556,925.9747分之一为一秒
[3] 1秒为铯133原子基态的两个超精细能阶间跃迁对应辐射的9,192,631,770个周期的持续时间。
[4] https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
[5] 国际原子时标是一种连续性时标,以原子钟所定义的秒为基本单位,由1958年1月1日0时0分0秒起,以日、时、分、秒计算。原子时标的准确度为每 日数纳秒,而世界时的准确度则只为数毫秒。