計算機時間、unix時間、linux時間、java時間爲何以1970年1月1日爲原點?從1970年1月1日開始計算?

今天在看Python   API時,看到time模塊:

The epoch is the point where the time starts. On January 1st of that year, at 0 hours,the “time since the epoch” is zero. For Unix, the epoch is 1970. To find out what the epoch is, look at gmtime(0).
定義time從1970年1月1日開始,忽然想到在JAVA裏,Oracle數據庫時間也是從1970
年1月1日開始計算。比如java類代碼
Date date = new Date(0);
System.out.println(date);
打印出來的結果:
Thu Jan 01 08:00:00 CST 1970
也是1970年1月1日,實際上時分秒是0點0分0秒(這裏打印出來是8點,稍後會作解釋)。
爲什麼這個時間會定義在1970年1月1日這個時候呢?
於是開始了Google,中文網頁根本找不到答案。於是試着搜索英文關鍵字,在Sun java論壇總算找到準確的帖子:
http://forums.sun.com/thread.jspa?threadID=595140&start=15
其中有一個回覆:
I suspect that Java was born and raised on a UNIX system.
UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970. 
是說java起源於UNIX系統,而UNIX認爲1970年1月1日0點是時間紀元.
但這依然沒很好的解釋"爲什麼",出於好奇,繼續Google,總算找到了答案:
http://en.wikipedia.org/wiki/Unix_time
這裏的解釋是:
最初計算機操作系統是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點。
我想以上問題如果作爲面試題,也能難倒一批人了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章