2014/05/02

[轉]系統時間定義從1970年原因

最初計算機操作系統是32 位,而時間也是用 32 位表示。

System.out.println(Integer.MAX_VALUE);
2147483647



Integer在 JAVA 內用 32 位表 示,因此 32 位能表示的最大值是 2147483647。 另外1 年 365 天的總秒數是 31536000,

2147483647/31536000 = 68.1

也就是說32 位能表示的最長時間是 68 年,而實際上到 2038年 01 月 19 日 03 時 14 分 07
秒,便會到達最大時間,過了這個時間點,所 有 32 位操作系統時間便會變 為
10000000 00000000 00000000 00000000

也就是1901年 12月 13 日 20時 45 分 52 秒,這樣便會出現時間回歸的現象,很多軟體便會運 行異常了。

到這裡,我想問題的答案已經出來了:

因為用32 位來表示時間的最大間隔是 68 年,而最早出現的 UNIX 操作系統考慮到計算
機產生的年代和應用的時限綜合取了 1970 年 1 月 1 日作為 UNIX TIME 的紀元時間 ( 開始
時間 ) ,而 java 自然也遵循了這一約束。

至於時間回歸的現象相信隨著64 為操作系統 的產生逐漸得到解決,因為用 64 位操作
系統可以表示到 292,277,026,596年 12月 4 日 15時 30 分 08 秒,相信我們的 N 代子孫,哪
怕地球毀滅那天都不用愁不夠用了,因為這個時間已經是千億年以後了。

最後一個問題:上面System.out.println(new Date(0)),列印出來的時間是8點而非0點,
原因是存在系統時間和本地時間的問題,其實系統時間依然是0點,只不過我的電腦時區
設置為東8區,故列印的結果是8點。

節錄自:
http://www.010cnc.net/subject/about/java%E7%82%BA%E5%95%A5%E8%A8%88%E7%AE%97%E6%99%82%E9%96%93%E5%BE%9E1970%E5%B9%B41%E6%9C%881%E6%97%A5%E9%96%8B%E5%A7%8B.html