聊一聊 GMT、UTC 以及 ISO8601

GMT:格林威治时间

格林威治(也称格林尼治)时间,也叫世界标准时间。是指位于英国伦敦郊区的【皇家格林尼治天文台】的标准时间,是本初子午线上的地方时,是 0时区的区时。

image.png

中国统一用的北京时间是位于东八区(+8)与标准时间相差 8 个小时。什么含义?举个例子:若 GMT(英国伦敦的格林威治)现在是上午 11 点,那中国北京时间就是 11 + 8 = 19 点(下午7点)。

北京时间 = GMT时间 + 8小时
复制代码

将这个公式再抽象一下,可表示为:

本地时间 = GMT时间 + 时区差
复制代码

北京位于东八区,则时区差 N = +8,美国纽约位于西五区,则时区差 N = -5。这么算来,若北京时间是晚上 23 点的话,美国纽约时间就是当天的上午 10 点(23 - 8 - 5 = 10)。

为什么格林威治作为标准时间

大背景是这样子的:19世纪开始,世界各国来往开始频繁,而欧洲大陆、美洲大陆和亚洲大陆都有各自的时区,为提高沟通效率避免混乱,各国的代表 1884 年在美国华盛顿召开了国际大会,选出英国伦敦的格林威治作为全球时间的中心点,并由它负责维护和计算,从 1924 年开始,格林威治天文台每小时就会向全世界播报时间(截止到 1979 年)。

其实选择英国格林威治最主要的原因是:当时大部分的船只都已经以格林威治子午线作为参考标准,毕竟曾经的英国可是日不落帝国,大航海时代末便开始称霸世界,拳头里面出政权。

地球自转

地球绕自转轴自西向东地转动(太阳东升西落),所以东时区的人会比西时区的人早一些看到太阳,从而时间上会早一点。

以本初子午线为中心,按照地球自转方向,每隔 15°经度(即太阳1个小时内走过的经度) 划分一个时区的方法,全球共分为 24 个时区:东1区至东12区,其中东西十二区各跨经度7.5°也叫半时区。

因为东、西12区的中央经线都180度经线,合称为东西12区,该时区的范围是东经172.5°——180°——西经172.5°。东经172.5°——180°的7.5°为东12区,180°——西经172.5°的7.5度为西12区,所以东、西12区各跨经度7.5度。

中国有哪几个时区

1个,这是一个错得比较合理的答案。合理是因为中国虽然幅员辽阔,但全国使用统一的北京时间,所以很容易被误以为只有一个时区。

错是因为拍脑袋想一想就知道,中国东西横跨5000+公里,怎么可能只躺在一个时区呢?正确答案是:中国大陆共横跨5个时区,各个时区大致的方位图如下:

image.png 这五个时区从左到右分别是:昆仑时区(GMT+5:30),新藏时区(GMT+6),陇蜀时区(GMT+7),中原时区(GMT+8)以及长白时区(GMT+8:30)。

1952年,除了新疆、西藏等地区外,全国统一使用东八区时间,也就是北京时间。西藏地区在民主改革后也基本使用北京时间。显然,这种统一,会让人们对“大一统”的印象更加深刻,深入日常生活,也更加有利于各个省份、自治区的政治经济融合。

中国用统一时间在沟通上确实方便得多,减少了很多不必要的麻烦。但是也带来一些“小问题”,比如新疆的朋友(位于东5/6区)实际比东八区的北京时间晚了 2个多小时左右,我们正常7点天黑准备吃完饭的时候,新疆那边还太阳当空照呢,还蛮有意思的~。

美国有哪几个时区

美国同样的幅员辽阔,横跨了6个时区:

image.png

从西到东依次是夏威夷时区(西10区)、阿拉斯加时区(西9区)、太平洋时区(西8区)、山地时区(西7区)、中部时区(西6区)和东部时区(西5区)。

  1. 东部时区(ET) :西5区,代表城市:华盛顿特区、纽约、迈阿密等,也称纽约时间。北京时间 = ET + 13h
  2. 中部时区(CT) :西6区,代表城市:芝加哥、休斯顿等。北京时间 = CT + 14h
  3. 山地时区(MT) :西7区,代表城市:丹佛、凤凰城等。北京时间 = MT + 15h
  4. 太平洋时区(PST) :西8区,代表城市:洛杉矶、拉斯维加斯、西雅图等。北京时间 = PST + 16h
  5. 阿拉斯加时区(AKST):西9区,代表城市:费尔班克斯。北京时间 = AKST + 17h
  6. 夏威夷时区(HST):西10区,代表城市:火奴鲁鲁。北京时间 = HST + 18h

从图中可以看出,美国的时区并不完全是用经线划分的,更多的是按州界或自然边界划分的。不过也有一些州被一分为二在两个时区里。

GMT和Http协议的渊源

Http1.1 协议对日期时间传输格式是有严格规定的,下面的这种格式是互联网传输的标准格式:

image.png

所有HTTP日期/时间戳都必须用格林威治标准时间(GMT)表示,没有例外,这一切都是由浏览器自动帮你完成的。对于HTTP来说,GMT完全等于UTC(协调世界时)。

UTC:世界标准时间

Coordinated Universal Time直译为:世界协调时间。它是以原子时作为计量单位的时间,计算结果极其严谨和精密。它比GMT时间更来得精准,误差值必须保持在0.9秒以内,倘若大于0.9秒就会通过闰秒来“解决”。

image.png

原子时:物质的原子内部发射的电磁振荡频率为基准的时间计量系统。美国的物理实验室在 2014 年造出了人类历史上最精确的原子钟,50亿年误差 1s。中国的铯原子钟也能确保 2000 万年误差不超过 1s。

1979年12月初内瓦举行的世界无线电行政大会通过决议,确定用“世界协调时间(UTC时间)”取代“格林威治时间(GMT时间)”,作为无线电通信领域内的国际标准时间。

UTC和GMT的区别

UTC和GMT都称作世界标准时间,为毛有了GMT还搞出个UTC,到底有何区别,下面做出简述。

GMT:老的时间计量标准,根据地球的自转和公转来计算时间的,自转一圈是一天,公转一圈是一年。但是呢,地球公转的轨道是椭圆形的:

image.png

并且后来人们发现地球的自转时间也并不是恒定的,这么一来就会造成有一天时间长一些,有一天时间短一些的情况,误差较大给人感觉时间不那么“精准”了,因此迫切需要一个更加精准的方案来计时,UTC诞生了。

UTC:1967年人类制作出原子钟,从而“发明”了UTC时间正式投入使用。它是真正意义上的标准时间,以原子钟所定义的秒长为基础,UTC时间认为一个太阳日(一天)总是恒定的86400秒(24小时)。

image.png

UTC是协调时间,含义为:一切以我为基准,全部向我看齐。所以称它为世界标准时间是没毛病的,而把GMT称作格林威治当地时间更为合适(也叫旧的标准时间)。

UTC和GMT的联系

由于在大多数情况下,UTC时间能与GMT时间互换。对此很多同学就丈二和尚摸不着头脑了,他俩这不就一样的吗?

其实非也。这里用通俗易懂的一句话来告知它俩的联系:UTC是标准时间参照,像GMT(格林威治时间)、ET(美国东部时间)、PST(太平洋时间)、CST(北京时间)等等都是具体的时区时间。GMT能和UTC直接转换,仅仅是因为碰巧GMT是0时区时间,数值上刚好和UTC是相等的(不需要精确到秒的情况下,二者可以视为相等),看起来一样,但是概念含义上请务必区分开来。

UTC与偏移量

在日常生活中,我们所使用的时间肯定是本地时间。在只有GMT的时候,本地时间是通过时区计算出来的,而现在UTC才是标准参考,因此采用UTC和偏移量(Offset)的方式来表示本地时间:

本地时间 = UTC标准时间 + 偏移量
复制代码

这个偏移量可表示为:UTC - 或UTC + ,后面接小时数,分钟数。如:UTC +9:30表示澳大利亚中央标准时间,UTC +8表示中国标准时间。偏移量常见的表示形式有:±[hh]:[mm]、±[hh][mm]、±[hh]这三种方式。如“北京时间09:30”表示为"09:30+08:00”或“ 09:30+0800 ” 或“ 09:30+08 ”。

举个例子:现在UTC时间是10:30z(z表示偏移量=0),那么北京时间现在若是16:30 +0800(下午4点半),对应的纽约时间就是05:30 -0500(早上5点半)。

注意:在UTC的世界里并无时区的概念,而是偏移量(时间点跟上偏移量才是一个正规的UTC时间),它和时区并无直接关系。

可以看到偏移量可以精确到分钟级别控制,非常精细化。全球只有24个时区(只能精确到小时),但偏移量有“无数个”。 为了方便沟通,时间日期联盟组织把世界主要国家/城市的偏移量汇总起来且都给取了个Time zone name名称用于沟通,共好几百个,部分截图如下:

image.png

CST

CST这个缩写比较尴尬的是它可以同时代表三个不同的时间:

  • CST (China Standard Time) :中国标准时间 UTC+8:00
  • Central Standard Time (USA) UTC-6:00
  • Cuba Standard Time UTC-5:00

CST到底啥意思就看如何翻译,所以需要根据上下文语境抉择:

image.png

ISO

ISO8601的中文名称是《数据存储和交换形式·信息交换·日期和时间的表示方法》。ISO8601 标准的第一版(ISO8601:1988)于 1988年发布,目前最新的一版与2019年发布(ISO8601-1:2019 和 ISO 8601-2:2019)。

image.png

一句话解释了,若需要找到一种国际通用的无歧义的日期和时间格式,ISO8601就是答案。

这个ISO标准能够帮助消除因不同的日期转换、文化差异、时区等的影响导致对日期时间格式理解上的偏差,它给出了一种无论对人还是机器都清晰定义的日期和时间表示形式。

任何人都可以使用这个ISO8601标准化地表达如下信息,

  1. Date,日期
  2. Time of day,时间
  3. Coordinated Universal Time (UTC),世界协调时间
  4. Local time with offset to UTC,UTC偏移的本地时
  5. Date and time,日期和时间
  6. Time intervals,时间间隔
  7. Recurring time intervals,重复时间间隔

标准制定的很细,它代表了国际通用的日期时间格式。

基本原则

  • 日期时间顺序排列:年、月、日、小时、分钟、秒、毫秒。
  • 每个日期时间都有一个固定的位数。(不够的话,用前导 0(leading zeros)进行填充)。
  • 可以使用两种格式表示:使用最少分割符的基本格式或者添加分割符使人们更加易读的扩展格式。该标准指出“基本格式应该避免使用纯文本(plain text)”。日期(年,月,周和日)之间使用的分割符是连字符,而冒号用做时间(小时、分钟和秒)之间的分割符。例如,2009年第一个月的第六天可以使用扩展格式表示为:2001-01-06,或者使用基本格式表示为:20090106。
  • 可以从任意日期时间的表示格式中删除任意值,但必须是从小到最大的顺序。例如,“2004-05”是一个有效的 ISO8601 日期,表示 2004 年第 5 个月。此格式永远不会代表 2004年某个月份的第五天,也不会代表从2004年到2005年。
  • 如果特定应用需要,支持在最小的时间值上加一个小数。

日历日期表示法

年由4位数字组成YYYY,或者带正负号的五位数字:±YYYY。。以公元1年(公历)为0001年,以公元前1年为0000年,公元前2年为-0001年,其他以此类推。应用其它纪年法要换算成公历,但如果发送和接受信息的双方有共同一致同意的其它纪年法,可以自行应用。

[YYYY] 表示四位数年份,从 0000 到 9999。[MM] 表示两位数月份,从 01 到 12。[DD] 表示该月的两位数日期,从 01 到 31。例如, "5 April 1981" 可以表示为扩展格式的"1981-04-05" 或基本格式的 "19810405" 。

星期日历表示法

可以用2位数表示年内第几个日历星期(从 W01 到 W53),再加上一位数表示日历星期内第几天(从 1 到 7),但日历星期前要加上一个大写字母W,如2004年5月3日可写成2004-W19-1或2004W191。但2005-W011是从2005年1月3日开始的,前几天属于上年的第53个日历星期。每个日历星期从星期一开始,星期日为第7天。

2005-W011 是2005年的第一个星期的星期一,如下所示。

image.png

第一个日历星期有以下四种等效说法:

  1. 本年的第一个星期四所在的那一周(ISO标准定义)。
  2. 1月4日所在的那一周。
  3. 本年度第一个至少有4天在同一星期内的那一周。
  4. 星期一在去年12月29日至今年1月4日以内的那一周。

推理可得,如果1月1日是星期一、星期二、星期三或者星期四,它所在的星期就是第一个日历星期;如果1月1日是星期五、星期六或者星期日,它所在的星期就是上一年第52或者53个日历星期;12月28日总是在一年最后一个日历星期。

周数可以通过计算星期四来获得:第 12 周包含一年中的第 12 个星期四。

ISO 周编号是从第 1 周的第一天(星期一)开始,到新 ISO 年之前的星期日结束(因此没有重叠或间隙)。它包括 52 或 53 个完整的星期。一年中的第一个 ISO 周可能最多有 3 天是在即将结束的公历年中;如果是三个,它们是星期一、星期二和星期三。类似地,一年中的最后一个 ISO 周可能在开始的公历年中最多有 3 天;如果三个,它们是星期五、星期六和星期日。每个 ISO 周的星期四总是在由 ISO 周编号年表示的公历年中。

例子:

  • 2008 年 12 月 29 日星期一写成“2009-W01-1”
  • 2010 年 1 月 3 日星期日写成“2009-W53-7”

顺序日期表示法

[DDD] 可以将一年内的天的序数用3位数字表示,从 001 到 365(闰年为366)。如2004年5月3日可以表示为2004-1242004124

日期时间表示法

ISO8601 采用 24 小时制。从 ISO8601-1:2019开始,基本格式为 T[hh][mm][ss],扩展格式为 T[hh]:[mm]:[ss]。

  • [hh] 指的是00 到 23 之间的小时。
  • [mm] 是指00 到 59 之间的分钟。
  • [ss] 指的是 00 到 60 之间的秒(其中 60 仅用于表示添加的[闰秒])。

因此,时间可能会显示为基本格式的“T134730”或 扩展格式的“T13:47:30” 。ISO8601-1:2019 允许在扩展格式中省略 T,如“13:47:30”,但仅在不存在日期表达式歧义风险时才允许在基本格式中省略 T。

为了更简洁(通过降低精度),可以从基本或扩展时间格式中省略秒或省略分和秒;由此产生的低精度时间格式是:

  • 基本格式的 T[hh][mm]或扩展格式的 [hh]:[mm](当省略秒数时)。
  • T[hh](当秒和分钟都被省略时)。

从 ISO 8601-1:2019开始,午夜只能称为“00:00”。该标准的早期版本允许对应于一天结束的“24:00”,但 2019 年修订版明确不允许这样做。

如果时间为UTC,则在时间后直接添加Z,不带空格。Z是 UTC 偏移量的指示符。因此,“09:30 UTC”表示为“09:30Z”或“T0930Z”。“14:45:15 UTC”将是“14:45:15Z”或“T144515Z”。

UTC 偏移(UTC offset)与上面的“Z”相同的方式附加到时间,格式为 ±[hh]:[mm]、±[hh][mm] 或 ±[hh]。

负UTC 偏移描述了UTC±00:00以西的时区,其中民用时间早于UTC,因此区域指示符看起来像“-03:00”、“-0300”或“-03” ”。

正UTC 偏移量描述了位于UTC±00:00或以东的时区,其中民用时间与UTC相同或更晚,因此区域指示符看起来像 "+02:00","+0200 ”或“+02”。

例子:

  • “-05:00”代表纽约标准时间 ( UTC-05:00 )
  • “-04:00”表示纽约夏令时 ( UTC-04:00 )
  • 伦敦标准时间 ( UTC±00:00 ) 的“+00:00”(但不是“-00:00”)
  • 开罗的“+02:00”(UTC+02:00)
  • 孟买的“+05:30”(UTC+05:30)
  • 基里巴斯的“+14:00”(UTC+14:00)

日期和时间的组合表示法

单个时间点可以通过连接完整的日期表达式、作为分隔符的字母“T”和有效的时间表达式来表示。例如,“2007-04-05T14:30”。在ISO 8601:2004中,经双方同意,允许省略“T”字符,如“200704051430”。但是在 ISO 8601-1:2019 中删除了此规定。ISO 8601 中不允许使用空格等其他字符分隔日期和时间部分,但在其配置文件 RFC 3339 中允许。

可以使用基本格式或扩展格式,但日期和时间必须使用相同的格式。日期表达式可以是日历、周或序数,并且必须使用完整的表示。可以使用指定的降低精度格式来表示时间。合并表示时,要在时间前面加一大写字母T,如要表示东八区时间2004年5月3日下午5点30分8秒,可以写成2004-05-03T17:30:08+08:0020040503T173008+08。如果需要时区指示符,则它遵循组合的日期和时间。例如,“2007-04-05T14:30Z”或“2007-04-05T12:30−02:00”。

夏令时

DST(Daylight Saving Time),夏令时又称夏季时间(可没有冬令时哦)。它是为节约能源而人为规定地方时间的制度(鼓励人们早睡早起,不要浪费电,夏天日照时间长尽量多用自然资源),全球约40%的国家在夏季使用夏令时,其他国家则全年只使用标准时间。正在使用夏令时的代表国家:美国、欧盟、俄罗斯等等。

image.png

每年的夏令时时间段还不一样(一般在3月的第2个周日开始,每年11月的第一个周日凌晨结束),比如美国2020年夏令时时间是:2020年3月8日 - 2020年11月1日。具体做法是:在3.8号这天将时钟往前拨拨1个小时,11.1号这天还原回来。

中国在1986 - 1992年短暂搞过一段时间,但太麻烦就“废弃”了。目前全世界有近110个国家每年要实行夏令时。自2011年3月27日开始俄罗斯永久使用夏令时,把时间拨快一小时,不再调回。

时间戳

时间戳一般指的UNIX时间,或类UNIX系统(比如Linux、MacOS等)使用的时间表示方式。定义为:从UTC时间的1970-1-1 0:0:0起到现在的总秒数(秒是毫秒、微妙、纳秒的总称)。

但是不可忽略的一个case:由于闰秒的存在,那么当闰秒发生时,就极有可能出现同一个时间戳表示两个时刻的情况(类似时钟回拨),而且闰秒还没规律所以无法程序式的避免,怎么破?

这个时候就需要一种专门的对时协议来保证了,它就是:网络时间协议。

网络时间协议

NTP即Network Time Protocol,网络时间协议。是通过时钟同步服务器从GPS卫星上获取标准的时间信号,将这些信号通过各种接口传输给自动化系统中需要时间信息的设备(计算机、保护装置、故障录波器、事件顺序记录装置、安全自动装置、远动RTU),这样就可以达到整个系统的时间同步。NTP 在大多数基于 Linux 和 Windows 的操作系统中实现,广泛用于控制系统(在局域网中精度在10ms左右。可用于精度要求不高的数采设备同步)。

image.png

NTP协议执行的过程如下:

  • 在客户端的 T0 时刻发送第一条消息(同步请求),检查服务器和请求者之间的时间延迟是否大于 17 分钟。

  • 消息在 T1 瞬间到达服务器:

    • 如果时间延迟大于 17 分钟,该过程将不会继续,并且结束这次同步。
    • 但是,如果时间少于 17 分钟,则同步继续。服务器在 T2 时刻发送一条消息及其时间。
    • 数据包在 T3 瞬间被客户端接收。每分钟进行一次时间的慢慢调整,直到接近 128 毫秒的服务器时间。两个时钟之间的延迟 (θ) 计算如下:

image.png

  • 从 128 毫秒开始,延迟时间每 17 分钟调整一次。

image.png

PTP 是一种高精度时间同步协议,可以到达亚微秒级精度,有资料说可达到30纳秒左右的偏差精度,但需要网络的节点(交换机)支持PTP协议,才能实现纳秒量级的同步。一般在实际使用中,现有的NTP可以达到5ms以内的精度,对一般的应用都是满足的;对于超高精度设备,可以使用PTP设备提高同步精度。

与NTP主要区别:PTP是在硬件级实现的,NTP是在应用层级别实现的。PTP 是主从同步系统,一般采用硬件时间戳,并配合一些对NTP更高精度的延时测量算法。此外,目前没有免费的 PTP 服务器,因此需要付费使用此资源或在安装中拥有主服务器。它使用两个 UDP 端口:319 用于事件消息,320 用于一般消息。

PTP主要用于:

  • 能源控制和发电。
  • 零件制造系统的控制。
  • 银行交易。
  • 测量测试中值的相关性。
  • 机器人控制。

该协议的工作原理如下:

image.png

  • 主时钟发送“同步消息”并保存消息“t1”的发送时间。客户端将它到达的时间保存在本地内存中:“t2”。
  • 主时钟再次发送包含值“t1”的“后续消息”。客户端的时钟执行t2-t1,并将其与自己时钟的时间相加,得到服务器时间对应的时间,不考虑发送速度和内部请求造成的延迟。
  • 稍后,设备发送“请求延迟消息”,保存发送它的时刻:“t3”。该消息到达服务器的时间在服务器上保存为“t4”。
  • 最后,主时钟返回具有“t4”的“响应延迟消息”。客户端的时钟计算时间延迟为 (t3+t2-t1-t4)/2。

总结

简单地讲呢,GMT格林威治时间可认为是以前的标准时间,而UTC时间是现在在使用的世界时间标准;时区是以本初子午线为中心来划分的,东为正西为负,本处子午线就位于英国伦敦的格林威治;夏令时是地方的时间制度(并非全球标准),施行夏令时的地方,每年有2天很特殊,即一天只有23个小时,另一天则有25个小时。

从源头上彻底了解了这些概念,将会让我们在处理与时间相关的问题时如虎添翼。

Guess you like

Origin juejin.im/post/7077380097484783623