最初計算機(jī)操作系統(tǒng)是32位,而時間也是用32位表示漩符。
System.out.println(Integer.MAX_VALUE); // 2147483647
Integer
在Java
內(nèi)用32位表示嗜暴,因此32位能表示的最大值是2147483647
。另外1年365天的總秒數(shù)是31536000
萎战,
2147483647/31536000 = 68.1
也就是說32位能表示的最長時間是68年,而實際上到2038年01月19日03時14分07秒撞鹉,便會到達(dá)最大時間,過了這個時間點鸟雏,所有32位操作系統(tǒng)時間便會變?yōu)?code>10000000 00000000 00000000 00000000孝鹊,也就是1901年12月13日20時45分52秒,這樣便會出現(xiàn)時間回歸的現(xiàn)象苔咪,很多軟件便會運行異常了。
因為用32位來表示時間的最大間隔是68年团赏,而最早出現(xiàn)的UNIX操作系統(tǒng)考慮到計算機(jī)產(chǎn)生的年代和應(yīng)用的時限綜合取了1970年1月1日作為UNIX TIME的紀(jì)元時間(開始時間)耐薯,而java自然也遵循了這一約束。
至于時間回歸的現(xiàn)象相信隨著64為操作系統(tǒng)的產(chǎn)生逐漸得到解決体谒,因為用64位操作系統(tǒng)可以表示到292,277,026,596年12月4日15時30分08秒
臼婆,相信我們的N代子孫,哪怕地球毀滅那天都不用愁不夠用了故响,因為這個時間已經(jīng)是千億年以后了颁独。
1969年8月,貝爾實驗室的程序員肯湯普遜利用妻兒離開一個月的機(jī)會惨缆,開始著手創(chuàng)造一個全新的革命性的操作系統(tǒng)坯墨,他使用B編譯語言在老舊的PDP-7機(jī)器上開發(fā)出了Unix的一個版本。隨后捣染,湯普遜和同事丹尼斯里奇改進(jìn)了B語言停巷,開發(fā)出了C語言榕栏,重寫了UNIX蕾各,新版于1971年發(fā)布。
那時的計算機(jī)操作系統(tǒng)是32位妨托,時間用32位有符號數(shù)表示兰伤,則可表示 68 年,
用32位無符號數(shù)表示,可表示136年敦腔。他們認(rèn)為 以 1970年 為時間 原點 足夠可以了。 因此会烙,C 的 time 函數(shù) 就這么 定了筒捺,后來的 java 等也用它纸厉,微機(jī)也用它颗品,工作站本來就是unix系統(tǒng)當(dāng)然也用它。(今后若用64位機(jī)年限更沒問題则吟。)
1970年1月1日 算 UNIX 和 C語言 生日锄蹂。
時間戳
全世界各個時區(qū)的時間可能都是不一樣的,那么就有了時間戳敬扛,可以不受時區(qū)的限制朝抖,精確的表示時間。
時間戳(timestamp)急侥,一個能表示一份數(shù)據(jù)在某個特定時間之前已經(jīng)存在的、 完整的坏怪、 可驗證的數(shù)據(jù),通常是一個字符序列陕悬,唯一地標(biāo)識某一刻的時間。
時間戳是指格林威治時間1970年01月01日00時00分00秒起至現(xiàn)在的總秒數(shù)胧卤。
有了時間戳拼岳,無論我們深處哪個時區(qū),從格林威治時間1970年01月01日00時00分00秒到現(xiàn)在這一時刻的總秒數(shù)應(yīng)該是一樣的叶撒。所以說耐版,時間戳是一份能夠表示一份數(shù)據(jù)在一個特定時間點已經(jīng)存在的完整的可驗證的數(shù)據(jù)粪牲。