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