[導(dǎo)讀]大家好,我是中興文檔小藍人。 前幾天,當我在寫通信科普文章的時候,突然有一種時空錯亂的感覺,恍惚間感覺這個場景十分熟悉,好像在不久之前,同樣的電腦,同樣的微風(fēng)拂面,同樣的我,做著同樣的事情。 就像是夢境與現(xiàn)實重疊,又像是時光河流在倒卷。 各位
前幾天,當我在寫通信科普文章的時候,突然有一種時空錯亂的感覺,恍惚間感覺這個場景十分熟悉,好像在不久之前,同樣的電腦,同樣的微風(fēng)拂面,同樣的我,做著同樣的事情。
就像是夢境與現(xiàn)實重疊,又像是時光河流在倒卷。
在另外的一個時空中還有一個你,他經(jīng)歷過相同的事情,于是這種熟悉感就會傳遞給你。
但是彰顯這個世界,是一個虛假世界的Bug,卻不斷的在我們身邊出現(xiàn):
為什么會有這么多的證據(jù),表明我們穿越到了1970年1月1日,這個日子有什么特殊的嗎?
今天,和小編一起來探索這個神秘的現(xiàn)象吧~
然后我們來看一下這個日期:1970.1.1,好像沒有什么特別的啊?
但是對于我們?nèi)粘J褂玫挠嬎銠C來說,意義非凡。
如果說宇宙大爆炸代表了宇宙的誕生起點,那么1970.1.1就代表著計算機的誕生時間點。
是不是感覺很奇特,現(xiàn)在我們隨處可見的計算機、智能手機,竟然才誕生50年!從來沒有一個事物可以發(fā)展的如此迅速,并如此劇烈得改變?nèi)祟惖纳睢?/span>
1969年8月,貝爾實驗室程序員肯.湯普遜耗時一個月,開發(fā)出了Unix的第一個版本。他估計也想不到,這個B語言開發(fā)的全新操作系統(tǒng),會產(chǎn)生如此深遠的影響。
盡管Unix一出世就得到了大家的肯定,但是肯.湯普遜并沒有滿足,他又和同事丹尼斯里奇一起改進了B語言,開發(fā)出C語言,并重寫了Unix,新版本于1971年發(fā)布。
同年,《Unix Programmer's Manual》出版,將格林威治時間(GMT)1971年1月1日0時0分0秒作為操作系統(tǒng)的起始時間。
現(xiàn)今的計算機系統(tǒng),或多或少受Unix的影響,延續(xù)Unix的計時方式。
格林威治時間(GMT)1970年1月1日0時0分0秒從此成為Unix世界的起始時間,甚至超越Unix成為整個計算機世界的起始時間。
Unix中常常使用一個數(shù)字記錄時間,即Unix紀元時間(格林威治時間1970年1月1日00:00:00)到當前時間的秒數(shù)。(根據(jù)系統(tǒng)的精度,時間單位有時為毫秒,有時為納秒)。
大于0表示在起始時間之后,小于0表示在起始時間之前。這個數(shù)字有時是浮點類型、有時是整數(shù)類型,統(tǒng)一稱為時間戳(Timestamp)。
時間戳實際上就是一個數(shù)字,人們賦予他時間的含義。
一開始的Unix都是32位的,所以時間戳的取值范圍為-2147483648(231) ~ 2147483647(231-1),不過一般我們認為計算機不會在1970年前使用,所以使用的是時間戳的正整數(shù),即最大值為2147483647(231-1)。
這個數(shù)字與時間之間,是如何建立聯(lián)系的呢?
最初Unix的規(guī)定是:時間戳每變化一次,就表示時間經(jīng)過了1/60秒。
比如時間戳取值為3600,表示以格林威治時間1970年1月1日00:00:00為起點,經(jīng)過了3600x1/60秒= 60秒,那現(xiàn)在的時間就是1970年01月01日00時01分00秒。
人們很快就發(fā)現(xiàn)了問題:一個時間戳代表1/60秒的話,2147483647x(1/60秒)/(24小時x60分鐘x60秒)=414.3天,也就是說只需要400多天,時間戳就全用完了。
設(shè)計出一個只能使用400多天的操作系統(tǒng),顯然不是大家的愿望。
于是Unix修改了規(guī)定:時間戳每變化一次,就表示時間經(jīng)過了1秒。這個規(guī)定延續(xù)到現(xiàn)在,還在使用。
比如時間戳取值為3600,表示以格林威治時間1970年1月1日00:00:00為起點,經(jīng)過了3600秒,那現(xiàn)在的時間就是1970年01月01日01時00分00秒。
從1/60秒擴大到1秒,操作系統(tǒng)的時間也從400多天擴展到了68年,雖然時間上仍然不多,但對于當時的人們來說,已經(jīng)是足夠使用的了。
看著這里,你是不是不禁要問,1970+68豈不是2038年,這不也快到了嗎?難道到時候再修改規(guī)定?
沒錯,32位時間戳能代表的最長時間是68年,到2038年01月19日03時14分07秒,便會到達最大時間。
過了這個時間點,所有32位操作系統(tǒng)時間便會變?yōu)?10000000 00000000 00000000 00000000,也就是1901年12月13日20時45分52秒,會出現(xiàn)時間回歸的現(xiàn)象,很多軟件便會運行異常了。
當初Unix使用的是32位,導(dǎo)致時間戳的取值有限。
而現(xiàn)在大部分的計算機,都是64位的了。
時間戳的取值范圍擴大為-9223372036854775808(263) ~ 9223372036854775807(263-1)。
換算成時間的話,64位的時間戳,可以覆蓋了1970年前2000多億年,后2000多億年,絕對夠用到宇宙的盡頭了。
原來如此,那到底為什么有些應(yīng)用程序中會顯示1970.1.1呢?
我們?nèi)粘J褂玫母鞣N應(yīng)用程序,都是構(gòu)建在操作系統(tǒng)上的。當需要展示時間時,應(yīng)用程序都要從操作系統(tǒng)中獲取時間戳的取值。
所以,1970.1.1的出現(xiàn),最大的可能就是應(yīng)用程序在獲取時間戳的時候,出現(xiàn)了Bug。
應(yīng)用程序使用了不恰當?shù)臄?shù)值、或者無法獲取系統(tǒng)時間戳的時候,就只能使用時間戳的默認取值。
而在計算機中,時間戳的默認值通常是0。
時間戳為0
,表示時間為(GMT)1970年1月1日0時0分0秒。
中國使用北京時間,處于東8區(qū),相應(yīng)就是早上8點。因此在中國,時間戳出錯了,就經(jīng)常會顯示為1970年1月1日08:00。
再遇到1970.1.1的時候,就可以會心一笑:這個應(yīng)用程序肯定出現(xiàn)Bug,沒法獲取到正確的時間戳了。
應(yīng)用程序獲取時間戳?xí)r出現(xiàn)錯誤,最多就是顯示了錯誤的時間。
未來的時光機,還構(gòu)造在計算機操作系統(tǒng)上的話,想要穿越時空,就必須以紀元時間為坐標,設(shè)置要穿越的時間點,即設(shè)置正確的時間戳。
時光機的設(shè)計者或者說是程序員們,一定要打好時間戳哦:
-
-
用了32位的時間戳,就只能回到1902年11月25日~2038年01月19之間;
-
用了64位的時間戳,那就隨意了,1970年的前后共4000億年的時空,足夠你任意翱翔了!
注意:穿越到1970年1月1日之前時,一定要把時間戳設(shè)置為負數(shù)。
那么,各位小伙伴們,你們有沒有遇到過Bug呢?
不管是應(yīng)用程序的Bug,還是現(xiàn)實世界的Bug,歡迎分享哦~
我們是一群平均從業(yè)年限5+的通信專業(yè)工程師。
關(guān)注我們,帶你了解通信世界的精彩!
你點的每個在看,我都認真當成了喜歡
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。