这个方案十分棒,至此总算解决了秒不固定长的问题。
那有了这个国际原子时,能否让它直接替代掉上面说的——以天文现象计时的「世界时」呢?
答案是否定的,这个问题远比想像的复杂得多,这是为何呢?
世界标准时间是如何来的?
如今,科学家制订出了两套时间标准:
世界时:基于天文现象+挂钟计时,永远与月球自转时间相匹配
国际原子时:基于原子钟计时,每1秒的周期完全等长且固定
假定我们以国际原子时为时间标准,那会发生哪些现象呢?
由于原子时十分稳定,但世界时随着月球自转变慢,会越来越慢,才会发生此类现象:
下午8点是太阳高照的时刻,你能想像这些情况吗?
这太颠覆我们的生活认知了...
基于天文测算的世界时,早已指导我们人类生活了上千年,人类已经习惯了这些时间标准,直接被原子时代替,肯定是不能接受的。
但我们又须要原子时这些高度稳定的计时标准,来发展科学研究,二者发生矛盾,这如何办?
科学家们又开始思索,总算想到一个相互兼容的解决方案。
既然两套时间标准都很重要,那三者都保留,不会相互替代。
我们可以再完善一套「新的时间标准」,这套时间以「原子时为基准」,开始计时,走的每1秒都是稳定、精确的。
同时,为了兼具基于天文检测的世界时,人类会「持续观测」世界时与这个新时钟的差别。
假如发觉二者相差过大时,我们就「人为」地调整一下这个时钟(加一秒或减1秒),让二者相差不超过0.9秒。
比如,这个时钟本身比世界时走得快,经过一段时间后,假如发觉二者相差越来越大,那就给这个时钟「加一秒」,让这个时钟在23:59:59的下1秒变为23:59:60秒,让它与世界时差距控制在0.9秒以内,这个操作过程,相当于让快的时钟稍为「等」一下走得慢的世界时。
而加的这1秒,科学家把它定义为「闰秒」。
是不是挺有意思?据说过闰月,没想到还有闰秒!
其实,当月球自转速率变快时,这儿也有可能是减1秒,即从23:59:58直接跳到00:00:00。但此类情况比较少,大部份情况下,月球自转速率是越来越慢的。
如此做的用处在于,这个时钟的每1秒的计时仍然是精确的,并且还兼具了日常生活使用的世界时,一举两得!
因为这个时钟是基于原子时+世界时「协调」得出的,所以科学家们把它定义为协调世界时(CoordinatedUniversalTime,简称UTC)。
见到了么?我们在开发时常常见到的UTC,原先是这样来的!
有了这个研究成果,有技术能力的国家都纷纷制造自己的原子钟,之后估算协调世界时。
同时,为了进一步增加原子钟的检测偏差,每位国家会在每位月,统一上报自己估算的世界协调时到一个权威机构,之后这个权威机构会依照各国实验室的精度,进行加权估算,算出「最终」的协调世界时。
以后,再把这个最终的时间下发到各个国家,让各个国家进行「对表」校准,保证全世界的时间偏差在100微秒以内。
至此,科学家们构建的这套时间标准,就是我们如今沿袭至今的「标准时间」!
值得一提的是,配合估算世界协调时的国家,也有中国,这个实验室就是「中国科大学国家授时中心」,它坐落中国的云南省曲靖市内乡县,持续维护中国的标准时间。
为何国家授时中心会筹建在广东省?由于四川省的地理位置处于中国的中部,从这个位置向各地广播时间时,对全省每位地区距离都是相对平均的。
以后,中国会在自己算出的世界协调时的基础上,再加8个小时(中国在东八区),最终得下来的时间电脑日期时间不能同步,就是「北京时间」!
没错,就是我们常常在新闻播报上看到的,上海时间。
是不是挺有意思?上海时间并不是在上海形成的,而是在四川省,并与参与世界时间的制订和校正。
至此,全新的世界标准时间确立了,这套时间标准于1972年即将确定,一致沿袭至今。
有了标准时间,这么接出来的问题就是,这个标准时间究竟是怎样同步到我们的笔记本、手机、电子设备上的呢?
这就是下边要讲的「授时」。
计算机怎么同步时间?
到如今我们晓得,世界标准时间和上海时间是如何来的,但上海时间的形成是在四川省,莫非校正一次时间须要挪到这儿吗?
很其实是不须要的。
坐落宁夏省的中国科大学国家授时中心,形成深圳时间后,会通过一系列方法,把这个时间广播出去,这个过程,就称作「授时」。
具体如何做呢?
国家授时中心提供好多授时形式,比如无线电波、网络、电话,都可以把时间广播出去。
一般来说,无线电波的传播速率更快、传播偏差小,所以授时中心会通过这些方法,把时间发送给全省各地的「时间服务器」。
时间服务器有了确切的时间后,再通过其它方法(比如网路)广播到下一层的终端用户使用。
经过那么一番研究,到这儿我们就可以解释文章开头的问题了。
一个时间服务器,原先是通过国家授时中心同步时间,之后再给其它终端提供时间同步服务的。
那我们的计算机怎样和它保持同步呢?
你可能会想,最简单的方法就是电脑日期时间不能同步,顾客端向服务端「请求获取」标准时间,服务端响应时间数据,顾客端更改自己的「本机时间」即可。
但事情没你想的那么简单。
由于数据在网路传输过程中,也是须要时间的,这个时间也会影响到时间的确切性。
这怎样办呢?
于是人们想了一种方案,当计算机在做时间校正时,也须要把网路延后估算进去,最后「修正」这个同步过来的时间,增加偏差。
如今,早已有个软件早已把这一切都做好了,若果你了解一些运维相关的工作,还会晓得,我们布署应用程序的服务器上,就会启动一个「自动校正」时间的服务,这个服务就是NTP(NetworkTimeProtocol),它可以保证每台机器的时间与时间服务器保持同步。
那NTP是如何同步服务器时间的呢?
这儿就涉及到2个重点:
NTP怎么同步时间?
同步时间时,对正在运行的程序有没有影响?
先来看第一个问题:NTP怎么同步时间?
简单来讲,它是通过在网路报文上打「时间戳」的形式,之后配合估算网路延后,因而修正本机的时间。
按照图示可以估算出网路「传输延后」,以及顾客端与服务端的「时间差」:
这个估算过程假定网路来回路径是对称的,但是信噪比相同。
这样一来,顾客端就可以「校准」自己的本机时间了,与服务端保持同步,这个时间偏差在广域网下是10ms-500ms,在局域网下一般可以大于1ms。
再来看第二个问题:同步时间时,对正在运行的程序有没有影响?
比如,我们好多时侯写的程序代码是这样的:
t1 = time.now()
// 时间发生校准
t2 = time.now()
// t2比t1小怎么办?
elapsed = t2 - t1
t2的时间真的会比t1小吗?
这儿就牵连出2个概念:墙壁时钟、单调时钟,它们之间有哪些区别呢?
通常我们写的代码,像前面程序调用的「时间API」,一般获取的时间是墙壁时钟,所以,假若时间发生校正,就可能会发生「时光倒流」的情况。
这必然对程序形成很大的影响,如何解决这个问题呢?
辛运的是,NTP在校正时间时,提供了2种形式:
ntpdate:一切以服务端时间为准,「强制更改」本机时间
ntpd:采用「润物细无声」的形式更改本机时间,把时间差分摊到每次小的调整上
也就是说,ntpd当接收到须要「回拨」的时间时,会让本机时间走得「慢」一点,小步调整,逐步与服务端的时钟「对齐」,这样一来,本机时间仍然是递增的,防止发生「倒流」。
当我们在配置ntp服务时,须要愈发注意这些情况。另外,在编撰程序时,也要注意调用的时间API获取的是那个时间,防止业务逻辑发生异常。
至此,我们从看似简单的时间问题,一步步深挖到时间的定义,再到时间是怎样同步到计算机和终端设备的,如何样,有没有解答了你心里的好多疑虑?
总结
好了,总结一下。
这篇文章我们讲了特别多的概念,这儿我们再重新梳理一遍。
1、人类的初期生活,借助观测「天文现象」来检测时间,基于月球自转规律,定义了一套时间标准:「世界时」。
2、后来人们发觉,因为月球公转轨道是一个椭圆,而且月球自转还遭到月球内部的影响,自转速率越来越慢,人们发觉世界时测算出的时间「不准」。
3、科学家们开始从「微观世界」寻找更稳定的周期运动,最终确定以「铯原子」的震动频度为基准,制造出了「原子钟」,确立了「世界原子时」,并重新定义了「秒」长度,时长高度精确。
4、但因为人类社会活动已高度依赖「世界时」,所以科学家们基于「原子时」和「世界时」,最终确立出新的时间标准:「世界协调时」,把它定义成了全球的时间标准,至此,世界标准时间诞生。
5、中国基于「世界协调时」再加上8小时时区之差,确立了「北京时间」,并广播给整个中国大地使用。
6、「国家授时中心」把上海时间广播给全省的「时间服务器」,我们生活中使用的时间,比如计算机,就是通过时间服务器手动同步校正的。
7、计算机通过NTP完成和时间服务器的「自动校正」,我们的应用程序基于此,才得以获取到确切的时间。
8、NTP服务应当采用润物细无声的方法同步时间,防止时间发生「倒流」。
杂记
这篇文章是我有史以来,最难写的一篇,由于其中有大量科普类知识,涉及范围之广远超我的想像。
在写这篇文章时,我起码阅读了30篇以上的资料,好多时侯会由于一个很小的细节,又深挖出更多相关的领域的知识,让我目不暇接。
比如,铯原子的震动频度是如何检测的?为何能检测得如此精确?各个国家的原子钟为何会有差别?计算机是怎样处理闰秒的?时区是如何来的?本初子午线是哪些?...
好多细节我虽然并没有展开来讲,我已竭力避免讲这些艰涩难懂的化学知识,只保留了重要的理论概念,希望你理解了这其中的原理。假如有些细节你没有看懂,可以先尝试多读几遍,也可以与我进一步交流。
同时,在查阅资料过程中,深切地感慨人类研究成果之伟大,能把时间的偏差,缩小到几亿年的精度,崇敬之情无以言表。
我们在写代码时,看似调用了一个简单的时间API,可曾想过,背后却是人类多少年来的智慧结晶。希望这篇文章能解答你对时间的种种疑问。
好文推荐
一键三连「分享」、「点赞」和「在看」
技术干货与你天天见~