為什麼計算機和一些電子產品的時間選擇在1970年?

手機,電腦,都把默認時間選定在1970,這是為什麼呢?1970年電子產品發生了什麼重大突破么?


it領域中有一種常用的計算時間的方法:

Unix 紀元(格林威治時間 1970 年 1 月 1 日 00:00:00)


百度知道:原文

go心的方向 | 三級

最初計算機操作系統是32位,而時間也是用32位表示。也就是說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的紀元時間(開始時間),至於時間回歸

的現象相信隨著64為操作系統的產生逐漸得到解決,因為用64位操作系統可以表示到292,277,026,596年12月4日15時30分08秒,

相信我們的N代子孫,哪怕地球毀滅那天都不用愁不夠用了,因為這個時間已經是千億年以後了。


早期軟體開發中,硬體成本很貴,內存啊什麼什麼的都是要1個位元組1個位元組省著用(估計現在在不少嵌入式系統中也是)。正常情況下要精確表示一個時間,至少要包含 年/月/日/時/分/秒 這些信息,如果從人類理解的角度來定義表示時間的數據類型,需要花費不少位元組。

於是在Unix系統設計時, Unix內核提供的基本時間服務 考慮了一種思路,即用一個整型數來表示自某個起始時間之後的秒數,需要知道人眼所能識別的時間點的時候,就可以臨時計算一下便可獲得。這樣內部保存時就可以以有限且統一的位元組空間來表示時間了。

至於起始時間為什麼選定為1970年1月1日00點00分00秒。考慮到第一版Unix的正式發布是在1971年,而這個項目是從1969年開始實施的。所以,不排除是 K R 在設計時一拍腦袋定下來了這個起始時間點。最關鍵的是, 這個關於秒數的數據類型time_t 也已然在後來成了標準C庫的一部分,因此被廣泛運用在各種 Unix-like的軟體系統中。相信很多嵌入式系統肯定也是借鑒了這種思路(畢竟嵌入式系統中,硬體資源猶為有限)。

悲催的是,這個設計存在一個很大的缺陷,即 2038年問題 。 目前似乎有很多系統都還沒有解決這個問題,哼哼~


// If a device"s clock is before 1970 (before 0), a lot of

// APIs crash dealing with negative numbers, notably

// java.io.File#setLastModified, so instead we fake it and

// hope that time from cell towers or NTP fixes it shortly.

if (System.currentTimeMillis() &< EARLIEST_SUPPORTED_TIME) {

Slog.w(TAG, "System clock is before 1970; setting to 1970.");

SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);

}

// The earliest supported time. We pick one day into 1970, to

// give any timezone code room without going into negative time.

private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;


其實因為我們是在東八區,所以經常看到的時間是

1970年1月1日8:00


推薦閱讀:

電腦長期不關機到底好還是不好?
生物信息學所用的計算機知識和CS專業的計算機知識有多大不同?
生物背景入門生物信息學需要補哪些計算機知識?
既然在 Windows 中文檔放在桌面重裝系統就沒有了,為什麼默認是C盤而不是其他盤?
日誌採集系統flume和kafka有什麼區別及聯繫,它們分別在什麼時候使用,什麼時候又可以結合?

TAG:計算機 | 電子產品 |