問(wèn)題的來(lái)源
當(dāng)我們用js輸入一下代碼時(shí):
let date = new Date()
console.log(date.getTime()) //1488159428585
會(huì)發(fā)現(xiàn)終端打印出一個(gè)很大的整數(shù)(1488159428585),那么這個(gè)數(shù)字代表什么呢?
經(jīng)過(guò)查閱,我才知道這個(gè)整數(shù)代表著如今的時(shí)間與1970年1月1日0時(shí)0分0秒
的時(shí)間差(以秒為單位),也就是說(shuō)從1970年1月1日0時(shí)0分0秒
到現(xiàn)在已經(jīng)過(guò)了1488159428585
秒了.那么問(wèn)題來(lái)了,為什么要從1970年1月1日0時(shí)0分0秒
開始呢?
Epoch Time (UNIX紀(jì)元)
Epoch Time 指一個(gè)特定的時(shí)間:1970-01-01 00:00:00 UTC酿愧。而UNIX系統(tǒng)認(rèn)為Epoch Time便是時(shí)間紀(jì)元,也就是說(shuō)在UNIX系統(tǒng)中,一切的時(shí)間會(huì)以1970年1月1日0時(shí)0分0秒
為一個(gè)基點(diǎn),然后通過(guò)經(jīng)過(guò)秒數(shù)再來(lái)計(jì)算現(xiàn)如今的時(shí)間.
那 1970 年發(fā)生了什么撼港,以至于 Unix 系統(tǒng)以它作 “紀(jì)元”。
原來(lái) Unix 就是在那個(gè)時(shí)代產(chǎn)生的玻熙,1969 年發(fā)布的雛形,最早是基于硬件 60Hz 的時(shí)間計(jì)數(shù)瓤摧。
1971年底出版的《Unix Programmer's Manual》里定義的 Unix Time 是以 1971年1月1日00:00:00 作為起始時(shí)間忿危,每秒增長(zhǎng) 60∠晨ǎ考慮到 32 位整數(shù)的范圍,如果每秒 60 個(gè)數(shù)字偏竟,則兩年半就會(huì)循環(huán)一輪煮落,于是改成以秒為計(jì)數(shù)單位。循環(huán)周期有136年之長(zhǎng)踊谋,就不在乎起始時(shí)間是 1970 還是 1971 年蝉仇,遂改成人工記憶、計(jì)算比較方便的1970年殖蚕。
于是Unix 的世界開啟了 “紀(jì)元”轿衔,Unix 時(shí)間戳也就成為了一個(gè)專有名稱。
Unix 時(shí)間戳是一種時(shí)間表示方式睦疫,定義為從格林尼治時(shí)間 1970年01月01日 00時(shí)00分00秒 起至現(xiàn)在的總秒數(shù)呀枢,不考慮閏秒。
時(shí)間回歸問(wèn)題
-
問(wèn)題起源
最初計(jì)算機(jī)操作系統(tǒng)是32位笼痛,而時(shí)間也是用32位表示.
int在java中是4字節(jié),32位.并且第一位是符號(hào)位,所以其能表示的最大值是2147483647.(
2^31-1
).另外1年365天的總秒數(shù)是 31536000裙秋,2147483647/31536000 = 68.1琅拌,也就是說(shuō)32位能表示的最長(zhǎng)時(shí)間是68年,從1970年開始的話摘刑,加上68.1进宝,實(shí)際最終到2038年01月19日03時(shí)14分07秒,便會(huì)到達(dá)最大時(shí)間枷恕,過(guò)了這個(gè)時(shí)間點(diǎn)党晋,所有32位操作系統(tǒng)時(shí)間便會(huì)變?yōu)?0000000 00000000 00000000 00000000,計(jì)算后(根據(jù)補(bǔ)碼計(jì)算)也就是1901年12月13日20時(shí)45分52秒徐块,這樣便會(huì)出現(xiàn)時(shí)間回歸的現(xiàn)象未玻,很多軟件便會(huì)運(yùn)行異常了。 -
解決辦法
至于時(shí)間回歸的現(xiàn)象隨著64為操作系統(tǒng)的產(chǎn)生逐漸得到解決胡控,因?yàn)橛?4位操作系統(tǒng)可以表示到 292,277,026,596年12月4日15時(shí)30分08秒扳剿,相信我們的N代子孫,哪怕地球毀滅那天都不用愁不夠用了昼激,因?yàn)檫@個(gè)時(shí)間已經(jīng)是千億年以后了庇绽。