計算機時間到底是怎么來的?程序員必看的時間知識!
[導讀]閱讀本文大約需要13分鐘。大家好,這篇文章我想和你聊一聊「時間」這個話題。時間總是在不經(jīng)意間流逝,我們在寫代碼時,也經(jīng)常會調(diào)用「時間API」,你有思考過這背后的原理嗎?關(guān)于時間的問題還有很多,例如:為什么計算機的時間有時候「走不準」?計算機究竟是怎么「自動校準」時間的?我們經(jīng)???..
閱讀本文大約需要 13 分鐘。大家好,這篇文章我想和你聊一聊「時間」這個話題。時間總是在不經(jīng)意間流逝,我們在寫代碼時,也經(jīng)常會調(diào)用「時間 API」,你有思考過這背后的原理嗎?關(guān)于時間的問題還有很多,例如:
- 為什么計算機的時間有時候「走不準」?
- 計算機究竟是怎么「自動校準」時間的?
- 我們經(jīng)常看到的 UTC 時間,到底是什么?
- 我們在新聞上看到的「北京時間」,真的來自北京嗎?
時間為什么總是走“不準”?
你肯定遇到過這樣的場景,家里買了一個鐘表,時間一長,就會發(fā)現(xiàn)它走得「不準」了。又或者,一臺長時間不使用的電腦,它的時間也會發(fā)生偏差。遇到這些情況,你可能會不以為然。時間不準,那我們就「人工」調(diào)準它。但你有沒有停下來想一想,為什么它們的時間會越走越不準呢?要回答這個問題其實不難,我們只需要搞清楚,它們的時間是怎么來的。鐘表和計算機內(nèi)部都有一個叫做「晶體振蕩器」的東西,給它加上電壓,它就會以固定的頻率振動。但這個振動頻率的「穩(wěn)定性」,取決于它的制造工藝,以及外界環(huán)境的影響。出于成本的考慮,鐘表的制作工藝沒那么高,所以它更容易有誤差。而電腦制造工藝雖然比較高,但它內(nèi)部的晶體振蕩器也會受到「溫度」變化帶來的影響,在工作過程中,也會有產(chǎn)生誤差。雖然它們的誤差很小,但日積月累下來,誤差就越來越明顯。因此,我們現(xiàn)在使用的計算機,都有「自動校準」時間的功能。但是如何校準呢?如何校準時間?
很簡單,只要你把電腦連上了「網(wǎng)絡(luò)」,你會發(fā)現(xiàn),它會自動與「網(wǎng)絡(luò)時間」保持同步。可問題是,這個「網(wǎng)絡(luò)時間」哪兒來的?我猜你大腦的第一反應是,每臺電腦肯定配置了一個「時間服務(wù)器」,之后這臺電腦會與服務(wù)器定時同步,自動校準。沒錯,確實是這樣,不光是電腦,我們平時使用的手機、平板、智能手表等電子設(shè)備,只要能連接網(wǎng)絡(luò),都會自動同步網(wǎng)絡(luò)時間。那繼續(xù)追問,這個「時間服務(wù)器」的時間就一定是準的嗎?理論來講,它應該也是一臺計算機,難道它不會遇到我們前面說的問題嗎?此外,這個網(wǎng)絡(luò)時間究竟是怎么「同步」到我們的電腦上的?你可能會說,那肯定是通過網(wǎng)絡(luò)數(shù)據(jù)包。問題又來了,網(wǎng)絡(luò)傳輸數(shù)據(jù)也是有「延遲」的,同步服務(wù)器時間,不還是存在誤差嗎?環(huán)環(huán)相扣,像一個俄羅斯套娃,很難解釋清楚。要想徹底搞清楚這些問題,就要深入到時間的「源頭」來尋找答案。時間是怎么來的?
時間是一個非常抽象的概念,多少年來,吸引著無數(shù)科學家、物理學家、甚至哲學家花費畢生精力去解釋時間的本質(zhì)是什么,從宇宙大爆炸到時空相對論,從黑洞到量子力學,都能看到關(guān)于時間這個問題的身影。這里我們不探討高深莫測的學術(shù)知識,只把目光放聚焦在計算機這個很小的范疇內(nèi)。但要想清楚解釋這個問題,也并非想的那么簡單。我們從最簡單的開始說起。想要知道時間是怎么被定義的,首先要知道「天」是怎么來的?答案是:觀察太陽。由于地球的「自轉(zhuǎn)」,人們可以看到日出日落,人們?nèi)粘龆?,日落而息,所以就把這一周期現(xiàn)象定義為「天」。地球除了自轉(zhuǎn),還在圍繞太陽公轉(zhuǎn),所以公轉(zhuǎn)一周就被定義為一「年」。從這些現(xiàn)象就能看出來,很早之前的人們,是以「天文現(xiàn)象」來確定時間的。再后來,人們?yōu)榱税褧r間定義得更「精確」,就把一天平均劃分為 24 等份,這就是「時」。同樣地,把 1 小時劃分 60「分鐘」,1 分鐘劃分為 60「秒」。這樣,時間的基本單位「秒」就被定義出來了。所以,秒與天的關(guān)系就是這樣的:1 秒 = 1 / 24 * 60 * 60 = 1 / 86400 天。這些定義,都與「地球自轉(zhuǎn)」和「太陽」息息相關(guān)。但是,后來人們發(fā)現(xiàn),地球的公轉(zhuǎn)軌道并不是一個正圓,而是一個「橢圓」,也就是說公轉(zhuǎn)速度是「不均勻」的,這意味著什么呢?這意味著每天的時間不是等長的,那根據(jù)天推算出的秒,自然也不是「等長」的。很明顯,這里的計算存在誤差。這怎么辦?聰明的人們就想到,把一年內(nèi)所有天的時長加起來,然后求「平均」,得到相對固定的「天」,然后再計算得出「相對平均」的秒,這樣就減小了誤差。確定了天文規(guī)律,人們開始制造「鐘表」,把時間表示出來。從擺鐘到機械鐘,再到現(xiàn)代廣泛使用的石英鐘,鐘表的制作工藝越來越高,時間精度也越來越高,現(xiàn)代石英鐘每天的計時誤差只有「千分之一秒」。所以,在 1927 年,人們以基于「天文現(xiàn)象」 「鐘表計時」,確立了第一套時間標準:世界時(Universal Time,簡稱 UT)。但是,隨著科技的發(fā)展,人類對太陽的觀測越來越精準,有意思的事情發(fā)生了。人們發(fā)現(xiàn),地球每天的自轉(zhuǎn)速度也「不是勻速」的,地球的自轉(zhuǎn)受到潮汐、地殼運動、冰川融化、地震等自然現(xiàn)象的影響,越來越慢!這會導致什么問題呢?這會導致之前規(guī)定的,每年平均下來一天的時間,現(xiàn)在來看,也是不一樣長的。例如,第 1 年算出來平均一天的時間是 23.9997 小時,第 2 年可能是 23.998 小時,第 3 年可能是 23.999 小時...那按照 1 秒 = 1 / 86400 天的定義,每一年的「秒」,也是不一樣長的。這就比較尷尬了,人們以地球自轉(zhuǎn)為依據(jù),定義出來的時間,還是不準!你可能會想,時間有誤差會有什么問題嗎?人們依賴不準確的天文現(xiàn)象,不也生活了幾個世紀么?確實,對于人們的基本生活影響其實并不大。但隨著人類活動的發(fā)展,人們對于高精度的時間場景開始變得越來越多。例如,體育賽事中百分之一秒的差距就能決定勝負,炮彈的發(fā)射要精確在千分之一秒內(nèi)發(fā)生,雷達技術(shù)甚至需要精確到百萬分之一秒...尤其是衛(wèi)星發(fā)射、火箭試驗等航天領(lǐng)域,對高精度的時間系統(tǒng)也提出了越來越高的要求!怎么辦?怎么徹底解決時間不準的問題?聰明的科學家們開始思考,既然觀測天文現(xiàn)象無法解決這個問題,那在微觀層面能否找到比較好的解決方案嗎?這時,他們開始把目光投向了「微觀世界」。一秒到底有多長?
讓我們梳理一下我們的需求。一直以來,我們對于「秒」的定義需求,從本質(zhì)上講,就是想要一個「完全穩(wěn)定」的周期,也就是說,期望每一秒都是固定「等長」的。而以天文觀測、地球自轉(zhuǎn)為基礎(chǔ)的時間測量,做不到這一點。那在微觀世界層面,是否存在一種元素,它的運動周期是「高度穩(wěn)定」,不受外界環(huán)境影響的呢?科學家們沿著這個思路開始探索...好,現(xiàn)在讓我們把視角下放,來到原子世界。一個原子雖然很小,但它內(nèi)部卻是一個很復雜的世界。每個原子都有一個原子核,核外分層排布著高速運轉(zhuǎn)的電子,當原子受電磁輻射時,它的軌道電子可以從一個位置「跳」到另一個位置,物理學上稱此為「躍遷」。人們發(fā)現(xiàn),原子內(nèi)的電子發(fā)生躍遷時,原子會吸收或放出一定能量的「電磁波」,這類電磁波就是一種「周期運動」,我們也可以把它看成原子內(nèi)部的「振蕩」。注:這個測量原理和測量過程比較復雜,這里把這些物理細節(jié)簡化了。不用太過糾結(jié)這個數(shù)值是怎么測量出來的,你只需要理解,這個微觀原子內(nèi)部的振蕩周期是非常穩(wěn)定的,它比之前根據(jù)天文現(xiàn)象測量出來的秒,要精確多得多。而基于這個銫原子振蕩制造出來的時鐘,我們就把它稱之為「原子鐘」。有了原子鐘,這就意味著,原子鐘輸出的每一秒,都是絕對「等長」的,非常穩(wěn)定,這樣一來,就實現(xiàn)了「精準計時」!這個精確程度可以達到多高呢?2000 萬年不差 1 秒!可見其精準程度之高。
科研技術(shù)還在發(fā)展,精密設(shè)備和測量能力也越來越高,最新的原子鐘甚至可以達到 1 億年不差 1 秒!有了原子鐘,人們基于原子鐘又確立了一套新的時間標準,叫做「國際原子時」(International Atomic Time,簡稱 TAI)。科學家們規(guī)定,從 1958-01-01 00:00:00 起,用原子時開始計時,它每走的一秒,都是非常精確的一秒(固定等長),實打?qū)嵉囊幻?,完全穩(wěn)定的一秒。這個方案非常棒,至此終于解決了秒不固定長的問題。那有了這個國際原子時,可否讓它直接取代掉前面說的——以天文現(xiàn)象計時的「世界時」呢?答案是否定的,這個問題遠比想象的復雜得多,這是為什么呢?
世界標準時間是怎么來的?
現(xiàn)在,科學家制定出了兩套時間標準:- 世界時:基于天文現(xiàn)象 鐘表計時,永遠與地球自轉(zhuǎn)時間相匹配
- 國際原子時:基于原子鐘計時,每一秒的周期完全等長且固定
- 原子時走得快,世界時走得慢,時間越久,兩者差距越來越大
- 日復一日,幾百年后,世界時的正午 12 點是太陽高照的時刻,而原子時可能已經(jīng)走到了下午 2 點了
- 幾千年后,太陽高照的時刻,原子時可能已經(jīng)走到了晚上 8 點!
當然,當?shù)厍蜃赞D(zhuǎn)速度變快時,這里也有可能是減一秒,即從 23:59:58 直接跳到 00:00:00。但這種情況比較少,大部分情況下,地球自轉(zhuǎn)速度是越來越慢的。這么做的好處在于,這個時鐘的每一秒的計時依舊是精確的,而且還兼顧了日常生活使用的世界時,一舉兩得!由于這個時鐘是基于原子時 世界時「協(xié)調(diào)」得出的,所以科學家們把它定義為協(xié)調(diào)世界時(Coordinated Universal Time,簡稱 UTC)。
看到了么?我們在開發(fā)時經(jīng)常看到的 UTC,原來是這樣來的!有了這個研究成果,有技術(shù)能力的國家都紛紛制造自己的原子鐘,然后計算協(xié)調(diào)世界時。同時,為了進一步降低原子鐘的測量誤差,每個國家會在每個月,統(tǒng)一上報自己計算的世界協(xié)調(diào)時到一個權(quán)威機構(gòu),然后這個權(quán)威機構(gòu)會根據(jù)各國實驗室的精度,進行加權(quán)計算,算出「最終」的協(xié)調(diào)世界時。之后,再把這個最終的時間下發(fā)到各個國家,讓各個國家進行「對表」校準,保證全世界的時間誤差在 100 納秒以內(nèi)。至此,科學家們建立的這套時間標準,就是我們現(xiàn)在沿用至今的「標 準 時 間」!值得一提的是,配合計算世界協(xié)調(diào)時的國家,也有中國,這個實驗室就是「中國科學院國家授時中心」,它位于中國的陜西省渭南市蒲城縣,持續(xù)維護中國的標準時間。
為什么國家授時中心會設(shè)立在陜西?。恳驗殛兾魇〉牡乩砦恢锰幱谥袊闹胁?,從這個位置向各地廣播時間時,對全國每個地區(qū)距離都是相對平均的。之后,中國會在自己算出的世界協(xié)調(diào)時的基礎(chǔ)上,再加 8 個小時(中國在東八區(qū)),最終得出來的時間,就是「北 京 時 間」!沒錯,就是我們經(jīng)常在新聞播報上聽到的,北京時間。
是不是挺有意思?北京時間并不是在北京產(chǎn)生的,而是在陜西省,并與參與世界時間的制定和校準。至此,全新的世界標準時間確立了,這套時間標準于 1972 年正式確定,一致沿用至今。有了標準時間,那么接下來的問題就是,這個標準時間到底是如何同步到我們的電腦、手機、電子設(shè)備上的呢?這就是下面要講的「授時」。
計算機如何同步時間?
到現(xiàn)在我們知道,世界標準時間和北京時間是怎么來的,但北京時間的產(chǎn)生是在陜西省,難道校準一次時間需要跑到這里嗎?很顯然是不需要的。位于陜西省的中國科學院國家授時中心,產(chǎn)生北京時間后,會通過一系列方式,把這個時間廣播出去,這個過程,就叫做「授時」。具體怎么做呢?國家授時中心提供很多授時方式,例如無線電波、網(wǎng)絡(luò)、電話,都可以把時間廣播出去。- NTP 如何同步時間?
- 同步時間時,對正在運行的程序有沒有影響?
- 網(wǎng)絡(luò)延時 = (t4 - t1) - (t3 - t2)
- 時間差 = t2 - t1 - 網(wǎng)絡(luò)延時 / 2 = ((t2 - t1) (t3 - t4)) / 2
這個計算過程假設(shè)網(wǎng)絡(luò)來回路徑是對稱的,并且時延相同。這樣一來,客戶端就可以「校準」自己的本機時間了,與服務(wù)端保持同步,這個時間誤差在廣域網(wǎng)下是 10ms - 500ms,在局域網(wǎng)下通??梢孕∮?1ms。再來看第二個問題:同步時間時,對正在運行的程序有沒有影響?例如,我們很多時候?qū)懙某绦虼a是這樣的:
t1?=?time.now()
//?時間發(fā)生校準
t2?=?time.now()
// t2比t1小怎么辦?
elapsed?=?t2?-?t1
t2 的時間真的會比 t1 小嗎?這里就牽涉出 2 個概念:墻上時鐘、單調(diào)時鐘,它們之間有什么區(qū)別呢?- 墻上時鐘:通常就是指前面講到的世界協(xié)調(diào)時 UTC,校準時間后,可能發(fā)生回撥
- 單調(diào)時鐘:計算機自啟動以后經(jīng)歷的納秒數(shù),不會回撥
- ntpdate:一切以服務(wù)端時間為準,「強制修改」本機時間
- ntpd:采用「潤物細無聲」的方式修改本機時間,把時間差均攤到每次小的調(diào)整上





