这篇文章我想和你聊一聊「时间」这个话题。
时间总是在不经意间流逝,我们在写代码时,也经常会调用「时间 API」,你有思考过这背后的原理吗?
文章来源:微信公众号丨水滴与银弹,但笔者并未找到原文链接,原作者可私信联系
关于时间的问题还有很多,例如:
为什么计算机的时间有时候「走不准」?
计算机究竟是怎么「自动校准」时间的?
我们经常看到的 UTC 时间,到底是什么?
我们在新闻上看到的「北京时间」,真的来自北京吗?
这篇文章,我们就来揭秘时间背后的秘密。
这篇文章非常有意思,希望你可以耐心读完。
你肯定遇到过这样的场景,家里买了一个钟表,时间一长,就会发现它走得「不准」了。
又或者,一台长时间不使用的电脑,它的时间也会发生偏差。
遇到这些情况,你可能会不以为然。时间不准,那我们就「人工」调准它。
但你有没有停下来想一想,为什么它们的时间会越走越不准呢?
要回答这个问题其实不难,我们只需要搞清楚,它们的时间是怎么来的。
钟表和计算机内部都有一个叫做「晶体振荡器」的东西,给它加上电压,它就会以固定的频率振动。但这个振动频率的「稳定性」,取决于它的制造工艺,以及外界环境的影响。
出于成本的考虑,钟表的制作工艺没那么高,所以它更容易有误差。而电脑制造工艺虽然比较高,但它内部的晶体振荡器也会受到「温度」变化带来的影响,在工作过程中,也会有产生误差。
虽然它们的误差很小,但日积月累下来,误差就越来越明显。
因此,我们现在使用的计算机,都有「自动校准」时间的功能。但是如何校准呢?
很简单,只要你把电脑连上了「网络」,你会发现,它会自动与「网络时间」保持同步。
可问题是,这个「网络时间」哪儿来的?
我猜你大脑的第一反应是,每台电脑肯定配置了一个「时间服务器」,之后这台电脑会与服务器定时同步,自动校准。
没错,确实是这样,不光是电脑,我们平时使用的手机、平板、智能手表等电子设备,只要能连接网络,都会自动同步网络时间。
那继续追问,这个「时间服务器」的时间就一定是准的吗?
理论来讲,它应该也是一台计算机,难道它不会遇到我们前面说的问题吗?
此外,这个网络时间究竟是怎么「同步」到我们的电脑上的?
你可能会说,那肯定是通过网络数据包。
问题又来了,网络传输数据也是有「延迟」的,同步服务器时间,不还是存在误差吗?
环环相扣,像一个俄罗斯套娃,很难解释清楚。
要想彻底搞清楚这些问题,就要深入到时间的「源头」来寻找答案。
时间是一个非常抽象的概念,多少年来,吸引着无数科学家、物理学家、甚至哲学家花费毕生精力去解释时间的本质是什么,从宇宙大爆炸到时空相对论,从黑洞到量子力学,都能看到关于时间这个问题的身影。
这里我们不探讨高深莫测的学术知识,只把目光放聚焦在计算机这个很小的范畴内。但要想清楚解释这个问题,也并非想的那么简单。
我们从最简单的开始说起。
想要知道时间是怎么被定义的,首先要知道「天」是怎么来的?
答案是:观察太阳。
由于地球的「自转」,人们可以看到日出日落,人们日出而作,日落而息,所以就把这一周期现象定义为「天」。
地球除了自转,还在围绕太阳公转,所以公转一周就被定义为一「年」。
从这些现象就能看出来,很早之前的人们,是以「天文现象」来确定时间的。
再后来,人们为了把时间定义得更「精确」,就把一天平均划分为 24 等份,这就是「时」。
同样地,把 1 小时划分 60「分钟」,1 分钟划分为 60「秒」。
这样,时间的基本单位「秒」就被定义出来了。
所以,秒与天的关系就是这样的:
1 秒 = 1 / 24 * 60 * 60 = 1 / 86400 天。
这些定义,都与「地球自转」和「太阳」息息相关。
但是,后来人们发现