小时候,家里的墙上总是挂着一个大时钟。每过一段时间,我就要去手动调整一下,因为它不准了。那时候小,以为是指针向上走的时候比较难,向下走的时候有惯性,所以走着走着就有了偏差。
后来有电脑了,但是由于经常的高三,电脑就一直处于关机状态。当高考完想打开电脑打游戏的时候,发现它的时钟也不准了。当时觉得是因为长时间断电导致的。
后来我明白,钟表和计算机内部都有一个叫做「晶体振荡器」的东西,给它加上电压,它就会以固定的频率振动。但这个振动频率的「稳定性」,取决于它的制造工艺,以及外界环境的影响。虽然它们的误差很小,但日积月累下来,误差就越来越明显。
原来墙上的钟表不准是时间的杰作呀,原来那个电脑时钟不准真的是因为断电呀。。
[](()自动校准网络时间
现在的计算机都有自动校准网络时间的功能了,但是问题来了,这个网络时间?哪儿来的?可靠?可控?
为什么我电脑上的网络时间和你电脑上的网络时间会是一致的呢?
首先我们排除一下我们的电脑通过网络互通有无的可能性哈,网络都是有延迟的。
其实最早接触计算机时间的时候,我是这样想的:国际上有某个管理计算机时钟的组织,我们的每台电脑向该组织校准我们的时间,再通过一定的技术消除这个网络延迟。
看到我这句话学物理的朋友估计要冲出来揍我了:误差只能减少,不可能消除。
虽然我物理不咋地,但是这句话我还是有深刻印象的。
所以,我电脑上的时间,跟你电脑上的时间,肯定是不一样的,只不过这个差距可以通过技术手段使得它小的可怜。
我看的那篇回答中还介绍了时间是怎么来的,以及人类对时间认知的发展。这里我就不多说了,文末附上原文,感兴趣的朋友或者觉得我说的理论不通的朋友可自行查看。
[](()国际时间标准
现在,科学家制定出了两套时间标准:
1、世界时:基于天文现象 + 钟表计时,永远与地球自转时间相匹配。(如果对天文学有感兴趣的朋友会知道,地球的自转是越来越慢的,每年都要少那么几分钟。)
2、国际原子时:基于原子钟计时,每一秒的周期完全等长且固定(以铯原子跃迁 9192631770 个周期,所持续的时间长度定义为 1 秒!)
这个铯原子非常之稳定,计时上亿年误差不会超过一秒。
为了协调二者,出现了闰秒的概念。(这里主要是要说一声儿:虽然一个慢,一个稳,但是会通过人为手段使二者基本一致。我们的计算机使用的自然是原子时间了。)
同时,为了进一步降低原子钟的测量误差,每个国家会在每个月,统一上报自己计算的协调世界时到一个权威机构,然后这个权威机构会根据各国实验室的精度,进行加权计算,算出「最终」的协调世界时。
之后,再把这个最终的时间下发到各个国家,让各个国家进行对表校准,保证全世界的时间误差在 100 纳秒以内。
之后,中国会在自己算出的协调世界时的基础上,再加 8 个小时(中国在东八区),最终得出来的时间,就是「北京时间」!
[](()计算机如何同步时间?
通常来说,无线电波的传播速度更快、传播误差小,所以授时中心会通过 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 这种方式,把时间发送给全国各地的「时间服务器」。
时间服务器有了准确的时间后,再通过其它方式(例如网络)广播到下一层的终端用户使用。
现在知道我们的网络时间是这么来的了,就又回到开头的问题了:消除误差(啊呸,减少误差)。
数据在网络传输过程中,也是需要时间的,这个时间也会影响到时间的准确性。
于是人们想了一种方案,当计算机在做时间校准时,也需要把网络延迟计算进去,最后「修正」这个同步过来的时间,降低误差。
具体怎么做呢?空话谁都会说。
现在,已经有个软件已经把这一切都做好了。我们部署应用程序的服务器上,都会启动一个「自动校准」时间的服务,这个服务就是 NTP(Network Time Protocol),它可以保证每台机器的时间与时间服务器保持同步。
简单来讲,它是通过在网络报文上打「时间戳」的方式,然后配合计算网络延迟,从而修正本机的时间。