大家好,我是 Kaito。

这篇文章我想和你聊一聊「时间」这个话题。

时间总是在不经意间流逝,我们在写代码时,也经常会调用「时间 API」,你有思考过这背后的原理吗?

关于时间的问题还有很多,例如:

  • 为什么计算机的时间有时候「走不准」?

  • 计算机究竟是怎么「自动校准」时间的?

  • 我们经常看到的 UTC 时间,到底是什么?

  • 我们在新闻上看到的「北京时间」,真的来自北京吗?

这篇文章,我们就来揭秘时间背后的秘密。

这篇文章非常有意思,希望你可以耐心读完。

基于这个原理,科学家们开始不断地试验、研究,尝试寻找一种运动「周期短、高度稳定」的原子。

终于,科学家们发现确实存在这样一种原子:铯原子,它内部的振荡周期比其它原子都要更短、更稳定,而且,这个过程基本不受环境因素的干扰。

经过层层试验,科学家们认为这是目前人类在地球上可测量到的,运动周期最短、周期最稳定的元素!

之后,科学家们就以之前定义的「秒」为基础,去测量一秒内这个铯原子内部电子周期运动的「次数」,测量出来的结果为 9192631770 次(91 亿+次)。

基于此,科学家们决定「抛弃」原来基于天文测量的秒,重新定义「秒」的时长,就是这个高度稳定的运动周期。

因此,在 1967 年,国际度量衡大会决定采用,以铯原子跃迁 9192631770 个周期,所持续的时间长度定义为 1 秒!

注:这个测量原理和测量过程比较复杂,这里这些物理细节简化了。不用太过纠结这个数值是怎么测量出来的,你只需要理解,这个微观原子内部的振荡周期是非常稳定的,它比之前根据天文现象测量出来的秒,要精确多得多。

而基于这个铯原子振荡制造出来的时钟,我们就把它称之为「原子钟」。

有了原子钟,这就意味着,原子钟输出的每一秒,都是绝对「等长」的,非常稳定,这样一来,就实现了「精准计时」!

这个精确程度可以达到多高呢?

2000 万年不差 1 秒!可见其精准程度之高。

科研技术还在发展,精密设备和测量能力也越来越高,最新的原子钟甚至可以达到 1 亿年不差 1 秒!

有了原子钟,人们基于原子钟又确立了一套新的时间标准,叫做「国际原子时」(International Atomic Time,简称 TAI)

科学家们规定,从 1958-01-01 00:00:00 起,用原子时开始计时,它每走的一秒,都是非常精确的一秒(固定等长),实打实的一秒,完全稳定的一秒。

这个方案非常棒,至此终于解决了秒不固定长的问题。

那有了这个国际原子时,可否让它直接取代掉前面说的——以天文现象计时的「世界时」呢?

答案是否定的,这个问题远比想象的复杂得多,这是为什么呢?

世界标准时间是怎么来的?

现在,科学家制定出了两套时间标准:

  1. 世界时:基于天文现象 + 钟表计时,永远与地球自转时间相匹配

  2. 国际原子时:基于原子钟计时,每一秒的周期完全等长且固定

是不是挺有意思?听说过闰年,没想到还有闰秒!

当然,当地球自转速度变快时,这里也有可能是减一秒,即从 23:59:58 直接跳到 00:00:00。但这种情况比较少,大部分情况下,地球自转速度是越来越慢的。

这么做的好处在于,这个时钟的每一秒的计时依旧是精确的,而且还兼顾了日常生活使用的世界时,一举两得!

由于这个时钟是基于原子时 + 世界时「协调」得出的,所以科学家们把它定义为协调世界时(Coordinated Universal Time,简称 UTC)。

为什么国家授时中心会设立在陕西省?因为陕西省的地理位置处于中国的中部,从这个位置向各地广播时间时,对全国每个地区距离都是相对平均的。

之后,中国会在自己算出的世界协调时的基础上,再加 8 个小时(中国在东八区),最终得出来的时间,就是「北京时间」!

没错,就是我们经常在新闻播报上听到的,北京时间。

是不是挺有意思?北京时间并不是在北京产生的,而是在陕西省,并与参与世界时间的制定和校准。

至此,全新的世界标准时间确立了,这套时间标准于 1972 年正式确定,一致沿用至今。

有了标准时间,那么接下来的问题就是,这个标准时间到底是如何同步到我们的电脑、手机、电子设备上的呢?

这就是下面要讲的「授时」。

计算机如何同步时间?

到现在我们知道,世界标准时间和北京时间是怎么来的,但北京时间的产生是在陕西省,难道校准一次时间需要跑到这里吗?

很显然是不需要的。

位于陕西省的中国科学院国家授时中心,产生北京时间后,会通过一系列方式,把这个时间广播出去,这个过程,就叫做「授时」。

具体怎么做呢?

国家授时中心提供很多授时方式,例如无线电波、网络、电话,都可以把时间广播出去。

根据图示可以计算出网络「传输延迟」,以及客户端与服务端的「时间差」:

  • 网络延时 = (t4 – t1) – (t3 – t2)

  • 时间差 = t2 – t1 – 网络延时 / 2 = ((t2 – t1) + (t3 – t4)) / 2

这个计算过程假设网络来回路径是对称的,并且时延相同。

这样一来,客户端就可以「校准」自己的本机时间了,与服务端保持同步,这个时间误差在广域网下是 10ms – 500ms,在局域网下通常可以小于 1ms。

再来看第二个问题:同步时间时,对正在运行的程序有没有影响?

例如,我们很多时候写的程序代码是这样的:

t1 = time.now()
// 时间发生校准
t2 = time.now()


// t2比t1小怎么办?
elapsed = t2 - t1

t2 的时间真的会比 t1 小吗?

这里就牵涉出 2 个概念:墙上时钟、单调时钟,它们之间有什么区别呢?

  • 墙上时钟:通常就是指前面讲到的世界协调时 UTC,校准时间后,可能发生回拨

  • 单调时钟:计算机自启动以后经历的纳秒数,不会回拨

一般我们写的代码,像上面程序调用的「时间 API」,通常获取的时间是墙上时钟,所以,如果时间发生校准,就可能会发生「时光倒流」的情况。

这必然对程序产生很大的影响,怎么解决这个问题呢?

幸运的是,NTP 在校准时间时,提供了 2 种方式:

  1. ntpdate:一切以服务端时间为准,「强制修改」本机时间

  2. ntpd:采用「润物细无声」的方式修改本机时间,把时间差均摊到每次小的调整上

也就是说,ntpd 当接收到需要「回拨」的时间时,会让本机时间走得「慢」一点,小步调整,逐渐与服务端的时钟「对齐」,这样一来,本机时间依旧是递增的,避免发生「倒流」。

当我们在配置 ntp 服务时,需要格外注意这种情况。另外,在编写程序时,也要注意调用的时间 API 获取的是哪个时间,避免业务逻辑发生异常。

至此,我们从看似简单的时间问题,一步步深挖到时间的定义,再到时间是如何同步到计算机和终端设备的,怎么样,有没有解答了你心中的很多疑惑?

总结

好了,总结一下。

这篇文章我们讲了非常多的概念,这里我们再重新梳理一遍。

1、人类的早期生活,依靠观测「天文现象」来测量时间,基于地球自转规律,定义了一套时间标准:「世界时」。

2、后来人们发现,由于地球公转轨道是一个椭圆,并且地球自转还受到地球内部的影响,自转速度越来越慢,人们发现世界时测算出的时间「不准」。

3、科学家们开始从「微观世界」寻找更稳定的周期运动,最终确定以「铯原子」的振动频率为基准,制造出了「原子钟」,确立了「世界原子时」,并重新定义了「秒」长度,时长高度精确。

4、但由于人类社会活动已高度依赖「世界时」,所以科学家们基于「原子时」和「世界时」相互协调,最终确立出新的时间标准:「世界协调时」,把它定义成了全球的时间标准,至此,世界标准时间诞生。

5、中国基于「世界协调时」再加上 8 小时时区之差,确立了「北京时间」,并广播给整个中国大地使用。

6、「国家授时中心」把北京时间广播给全国的「时间服务器」,我们生活中使用的时间,例如计算机,就是通过时间服务器自动同步校准的。

7、计算机通过 NTP 完成和时间服务器的「自动校准」,我们的应用程序基于此,才得以获取到准确的时间。

8、NTP 服务应该采用润物细无声的方式同步时间,避免时间发生「倒流」。

后记

这篇文章是我有史以来,最难写的一篇,因为其中有大量科普类知识,涉及范围之广远超我的想象。

在写这篇文章时,我至少阅读了 30 篇以上的资料,很多时候会因为一个很小的细节,又深挖出更多相关的领域的知识,让我目不暇接。

例如,铯原子的振动频率是怎么测量的?为什么能测量得这么精确?各个国家的原子钟为什么会有差异?计算机是如何处理闰秒的?时区是怎么来的?本初子午线是什么?…

很多细节我其实并没有展开来讲,我已尽力避开讲那些晦涩难懂的物理知识,只保留了重要的理论概念,希望你理解了这其中的原理。如果有些细节你没有读懂,可以先尝试多读几遍,也可以与我进一步交流。

同时,在查阅资料过程中,真切地感叹人类研究成果之伟大,能把时间的误差,缩小到几亿年的精度,敬佩之情无以言表。

我们在写代码时,看似调用了一个简单的时间 API,可曾想过,背后却是人类多少年来的智慧结晶。希望这篇文章能解答你对时间的种种疑惑。

如果你对时间这个话题的学习意犹未尽,可以关注我的公众号「水滴与银弹」,在后台回复「时间」,获取更多我整理的资料学习。

如果你还想看更多优质原创文章,欢迎关注我的公众号 「水滴与银弹」。

我是 Kaito,是一个对于技术有思考的资深后端程序员,在我的文章中,我不仅会告诉你一个技术点是什么,还会告诉你为什么这么做?我还会尝试把这些思考过程,提炼成通用的方法论,让你可以应用在其它领域中,做到举一反三。

微信关注「水滴与银弹」公众号,第一时间获取优质技术干货。7 年资深后端研发,给你呈现不一样的技术视角。

本文文字及图片出自 InfoQ

余下全文(1/3)

本文最初发表在wkee.net,文章内容属作者个人观点,不代表本站立场。

分享这篇文章:

请关注我们:

《计算机时间到底是怎么来的?程序员必看的时间知识!》有1个想法

  1. admin  这篇文章, 并对这篇文章的反应是俺的神呀赞一个

发表评论

邮箱地址不会被公开。 必填项已用*标注