關(guān)于閏秒
2012年6月30日,也就今天晚上,時間會多出現(xiàn)一秒,也就是我們所說的閏秒。我不知道大家對閏秒的了解有多少,所以寫下這篇文章。
背景知識
閏秒是在在UTC(中文“世界標(biāo)準(zhǔn)時間”或“世界協(xié)調(diào)時間”/英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”)是基于Atomic Clock(原子時鐘)的一種時間,向太陽時(Solar Time )對齊的一種方法,因為太陽時是根據(jù)地球公轉(zhuǎn)來計算的。所以,1972年制定的UTC為了確保其時間相對于UTC的時間誤差不能超過0.9秒,因此在過一段時間后需要加一秒。下圖是有UTC以來閏秒的調(diào)整表(來自Wikipedia閏秒的中文詞條)
從上表中我們可以看到,從1972年到現(xiàn)在,在這四十年里已經(jīng)進(jìn)行過25次的閏秒調(diào)整。閏秒是在每年6月或12月的***一天的***一分鐘進(jìn)行跳秒或不跳秒。是否加入閏秒由位于巴黎的國際地球自轉(zhuǎn)和參考坐標(biāo)系統(tǒng)服務(wù)(IERS – International Earth Rotation and Reference Systems Service)決定。如果決定加入閏秒,那么這一秒是被加在第二天的00:00:00前的,也就是說,時間會出現(xiàn)23:59:60的情況,然后才是第二天的00:00:00。如果是負(fù)閏秒的話,23:59:58的下一秒就直接跳到第二天的00:00:00了?,F(xiàn)在,所有閏秒都是正閏秒。
計算機(jī)處理閏秒
那么,對于我們的電腦系統(tǒng)來說,怎么處理這個閏秒呢?一般來說,我們需要為我們的電腦系統(tǒng)配置UTC時鐘,并通過NTP (Network time protocol)來進(jìn)行時間同步,NTP服務(wù)器會一級一級地下發(fā)閏秒事件通知直到最邊緣的NTP服務(wù)器,然后NTP服務(wù)器就會把閏秒通知發(fā)給客戶端的操作系統(tǒng),由操作系統(tǒng)來處理閏秒通知。
雖然閏秒調(diào)整對普通民眾的日常生活不會產(chǎn)生影響。不過,這個問題將影響部分開啟ntp服務(wù)的Linux操作系統(tǒng)——會導(dǎo)致Linux內(nèi)核Crash!Linux kernel是在2.6.18-164.e15之后的版本中解決了這個問題。換句話說,Linux kernel低于2.6.18-164的Linux系統(tǒng),無論是什么公司的Linux都將受到影響。(今晚過后大家可以查看一下你的Linux系統(tǒng)日志,看看閏秒有沒有發(fā)生)
可以參看下面的bug描述:
- LKML: Chris Adams: Re: Bug: Status/Summary of slashdot leap-second crash on new years 2008-2009
- Bug 479765 – Leap second message can hang the kernel
那么,我們的操作系統(tǒng)是怎么處理正閏秒通知的?通常來說有三種實現(xiàn):
- 后退一秒。
- 停止一秒。
- 真正的增加一秒。
懂編程的人一眼就能看出來,前兩種方式是以一種Workaround或Hack的方式解決這個問題。***種方式會導(dǎo)致一些基于timestamp的消息通知亂序了,而第二種會導(dǎo)致出現(xiàn)兩個一模一樣的timestamp。***一種不會出現(xiàn)timestamp的問題。對了,你還記得以前那篇《你確信你了解時間嗎?》的文章嗎?
***,說說Windows,Windows Time Service不支持閏秒通知,所以,當(dāng)閏秒發(fā)生的時候,你的Windows上的時間會比實際時間快一秒鐘,這需要等下一次的時鐘同步才會完成修正。
【編輯推薦】