問題的來源
當我們用js輸入一下代碼時:
let date = new Date()
console.log(date.getTime()) //1488159428585
會發現終端打印出一個很大的整數(1488159428585),那么這個數字代表什么呢?
經過查閱,我才知道這個整數代表著如今的時間與1970年1月1日0時0分0秒
的時間差(以秒為單位),也就是說從1970年1月1日0時0分0秒
到現在已經過了1488159428585
秒了.那么問題來了,為什么要從1970年1月1日0時0分0秒
開始呢?
Epoch Time (UNIX紀元)
Epoch Time 指一個特定的時間:1970-01-01 00:00:00 UTC。而UNIX系統認為Epoch Time便是時間紀元,也就是說在UNIX系統中,一切的時間會以1970年1月1日0時0分0秒
為一個基點,然后通過經過秒數再來計算現如今的時間.
那 1970 年發生了什么,以至于 Unix 系統以它作 “紀元”。
原來 Unix 就是在那個時代產生的,1969 年發布的雛形,最早是基于硬件 60Hz 的時間計數。
1971年底出版的《Unix Programmer's Manual》里定義的 Unix Time 是以 1971年1月1日00:00:00 作為起始時間,每秒增長 60。考慮到 32 位整數的范圍,如果每秒 60 個數字,則兩年半就會循環一輪,于是改成以秒為計數單位。循環周期有136年之長,就不在乎起始時間是 1970 還是 1971 年,遂改成人工記憶、計算比較方便的1970年。
于是Unix 的世界開啟了 “紀元”,Unix 時間戳也就成為了一個專有名稱。
Unix 時間戳是一種時間表示方式,定義為從格林尼治時間 1970年01月01日 00時00分00秒 起至現在的總秒數,不考慮閏秒。
時間回歸問題
-
問題起源
最初計算機操作系統是32位,而時間也是用32位表示.
int在java中是4字節,32位.并且第一位是符號位,所以其能表示的最大值是2147483647.(
2^31-1
).另外1年365天的總秒數是 31536000,2147483647/31536000 = 68.1,也就是說32位能表示的最長時間是68年,從1970年開始的話,加上68.1,實際最終到2038年01月19日03時14分07秒,便會到達最大時間,過了這個時間點,所有32位操作系統時間便會變為10000000 00000000 00000000 00000000,計算后(根據補碼計算)也就是1901年12月13日20時45分52秒,這樣便會出現時間回歸的現象,很多軟件便會運行異常了。 -
解決辦法
至于時間回歸的現象隨著64為操作系統的產生逐漸得到解決,因為用64位操作系統可以表示到 292,277,026,596年12月4日15時30分08秒,相信我們的N代子孫,哪怕地球毀滅那天都不用愁不夠用了,因為這個時間已經是千億年以后了。