這個困擾程序員50年的問題,終于要被解決了?


近日,Google、微軟、facebook 和亞馬遜終于忍不了了,聯(lián)合呼吁廢除閏秒,什么是閏秒呢?閏秒到底做錯了什么?為什么各大互聯(lián)網(wǎng)公司想要廢除他呢?
閏秒概念是 1972 年提出的,之所以有這個概念,主要是因為由于潮汐等自然現(xiàn)象的影響,地球的自轉(zhuǎn)速度并不是恒定的。
所以,每隔一段時間世界標準時間「協(xié)調(diào)世界時(UTC)」會依據(jù)地球圍繞太陽運動計算的「世界時(UT)」之間出現(xiàn)小的偏差。
所以就需要對協(xié)調(diào)世界時進行調(diào)快或者撥慢1秒來消除這個偏差。
閏秒分為正閏秒和負閏秒,正閏秒表示需要在UTC中插入1秒,負閏秒表示需要在UTC中減少1秒。
當科學(xué)家們發(fā)現(xiàn)”哎呀、今年的地球轉(zhuǎn)的有點快呀,趕緊加一個閏秒來校正一下吧“,這個時間就會發(fā)生”正閏秒”。
當閏秒發(fā)生時,就需要通過網(wǎng)絡(luò)時間協(xié)議NTP (Network time protocol)來進行時間同步,NTP服務(wù)器會一級一級地下發(fā)閏秒事件通知直到最邊緣的NTP服務(wù)器,然后NTP服務(wù)器就會把閏秒通知發(fā)給客戶端的操作系統(tǒng),由操作系統(tǒng)來處理閏秒通知。
如果你的計算機系統(tǒng)沒有開啟NTP服務(wù),那么導(dǎo)致的問題就是你的計算機上的機器時間就會比世界時間慢1秒。
如果開了NTP服務(wù)的話,就需要操作系統(tǒng)來處理這個閏秒。
一般來說,閏秒的調(diào)整一般被安排在6月30日或者12月31日,一般會調(diào)整在最后一分鐘,也就是說,某一年的6月30日的11:59分有61秒。那么計算機系統(tǒng)會如何處理這個閏秒呢?
一般有以下幾種方式,如:
1、直接顯示23:59:60這樣的時間。
2、顯示兩次23:59:59這個時間。
3、把這一秒平均分到最后一分鐘的每一秒鐘,也就是11:59還是有60秒,但是每一秒的時長是1+1/60 秒。
不同的操作系統(tǒng),不同操作系統(tǒng)的不同版本,都會有不同的處理方式,所以我們的代碼就需要有足夠的魯棒性來兼容這些閏秒的處理方式,如果沒有做好兼容,那么就會發(fā)生各種各樣的問題。
如需要兼容對23:59:60的處理;如操作會出現(xiàn)兩次23:59:59,這對于一些對時間有精確的強依賴的程序來說,可能就會導(dǎo)致致命的問題,尤其是一些依賴時間戳的服務(wù)或者工具。
50年來,閏秒已經(jīng)出現(xiàn)過27次,每一次出現(xiàn)都是一片”哀鴻遍野”,如:
2012 年 7 月 1 日零點, Reddit、Mozilla、領(lǐng)英、Yelp 和 Amadeus 等網(wǎng)站宕機數(shù)十分鐘。
2015 年 7 月 1 日零點,全球約 2000 個計算機網(wǎng)絡(luò)突然短暫中斷;美國洲際交易所被迫中止交易 61 分鐘。
2017 年 1 月 1 日零點,Cloudflare 等云服務(wù)廠商服務(wù)突然崩潰。
因為閏秒的發(fā)生是受自然現(xiàn)象影響的,所以他完全無法預(yù)測也沒有任何規(guī)律。對于程序員來說,這種無規(guī)律的事情,每次發(fā)生都需要進行一次特殊處理,而每一次特殊處理都可能要付出慘痛的代價。
所以,這些國際大廠終于忍不了站出來呼吁廢除閏秒了,作為一個程序員,我舉雙手+雙腳贊成!
參考資料:
往期推薦

如何搭建一支搞垮公司的技術(shù)團隊?

各大主流編程語言性能PK,結(jié)果出乎意料

金額計算用 BigDecimal 就萬無一失了?看看這五個坑吧~~
