關於計算機中時間的科普和八卦


作者:Jack47
轉載請保留作者和原文出處

PS:如果喜歡我寫的文章,歡迎關注我的微信公眾賬號程序員傑克,兩邊的文章會同步,也可以添加我的RSS訂閱源

在了解計算機中的時間之前,來看看現實生活中的時間標准:協調世界時

協調世界時(Coordinated Universal Time)

協調世界時(UTC),又稱世界標准時間或世界協調時間,簡稱UTC,是用來在全球范圍內同步時間的方法,是最主要的世界時間標准。

UTC是通過非常精確的原子鍾來維護,它以國際原子時秒長為基礎。為了抵消地球自轉變慢的影響,需要不規則的加入閏秒(比如2016年就加入了一秒)。說人話就是人為規定的一天與地球自傳產生的差異(地球自轉是緩慢變化的,並不是精確的24小時)。閏年也是這么來的,為了彌補人為規定的紀年與地球公轉產生的差異。

格林尼治時間(Greenwich Mean Time)和UTC是相等的,GMT是舊式的方法。協調世界時是最接近格林威治標准時間(GMT)的幾個替代時間系統之一。在分布式系統中,或者在實時處理的系統中,時間的同步是非常重要的,之前看到一個新聞,黑客通過干擾金融交易中心的時鍾,來達到進行違法交易的目的。

原子鍾的發明之前,人們通過天文觀測來矯正時間,而原子鍾提供了一種更穩定且更方便的守時機制。時間的協調首先是應用在無線電廣播中,將時間的步長和頻率的變化得到了協調。

Unix時間

Unix時間(Unix Time)),也叫做POSIX時間或紀元時間(epoch time),是用來記錄時間的流逝,定義為從UTC時間1970年一月一日00:00開始流逝的秒數,不考慮閏秒。從定義可以看到它只代表了從Unix紀元開始流逝的秒數,所以你身處地球上何處,這個時間都是一樣的。Unix系統中計算機內部的時間都是使用Unix時間的。而給用戶看時,就需要轉換成日期和時間的這種對人友好的形式。

查看當前Unix時間

在類Unix系統上查看當前的Unix時間:

$ date +%s
1490451854

一般Unix時間都是精確到秒,但也有些地方Unix時間是精確到毫秒的

Unix紀元(Epoch time)

紀元(Epoch)是指具有歷史意義的某一刻,其實就是一個參考點。比如在朝鮮,人們使用1912年作為日歷的紀元,對他們而言,日歷的起點是1912年,因為這一年是Kim II-Sung的誕辰。Unix紀元是Unix或類Unix系統,一些C/C++,Java等編程語言使用的紀元,從1970年一月一日00:00 開始。而其他的操作系統或者編程語言,使用的就是不一樣的紀元起始日期了,比如 Microsoft C/C++ 7.0 使用的是 1899年十二月31號。從Unix紀元(1970-01-01-00:00:00:就是Unix時間的零點,以后的時間是正的,而Unix紀元之前的時間就是負值。

為什么Unix系統中紀元時間(epoch time)是1970年?

這個問題得去問Unix之父:Ken ThompsonDennis Ritchie了,是他們選擇這個時間作為Unix系統的紀元時間的。

第一版的Unix程序員手冊是1971年11月份出版的,上面定義Unix時間是“從1971年一月一日00:00:00開始,單位是一秒的六十分之一“。這意味在Unix時間的最早版本中,時間計數器以60Hz的頻率(芯片的振盪器頻率)遞增,每隔1/60秒,計數器就加一。當時使用的整數計數器是32位的,這樣Unix時間能夠表示的范圍就非常受限了,2^32/60/3600/24/30/12 大約是 2.3年。所以后來經過多次更改,頻率變成了1Hz,紀元時間改為了1970年一月一日00:00:00。

有一種說法是Unix操作系統誕生於1970年,但實際上並不是的,在1969年左右,Unix的概念就已經誕生了,Unix的最早版本已經誕生了。Wired網站上的一篇文章寫道

Ritchie說這個時間其實是隨意選擇的,因為需要一個統一的日期來作為時間的起點,而1970年的元旦,看起來是最方便的。

時期和時間的國際標准表示方法

國際標准化組織規定了日期和時間的表示方法ISO 8601,用來規定日期和時間相關的數據交換時的格式。如果時間是UTC時間,那么末尾會帶個大些的Z。比如寫下本博客時,符合ISO 8601標准的UTC時間為 2017-03-25T14:35Z。因為北京的時區為東八區,比UTC時間要早8個小時,所以此時北京的當地時間(local time)為2017-03-25T22:35。 而上文提到的Unix紀元,用ISO 8601來表示,是UTC時間:1970-01-01T00:00:00Z

可以把精確度為秒的Unix時間轉化到localTime

date -d@timestamp 

有趣的事件

2000年問題

由於Unix時間戳是32位的,所以最大值是 0x7FFF:FFFF, 即2^31 - 1 = 2147483647,即2038年1月19號,此時會發生什么呢?如果時間戳不遷移到64位系統,那么此時時間戳會歸零,需要所有的程序去適應這個狀況,就跟1999年最后一天發生的事情一樣:2千年問題
可以訂購一件這樣拉風的體恤:
The end

iPhone/iPad變磚

如果把蘋果iPhone、iPad等設備的系統時間設置為1970年1月1日,隨后重啟設備,它會直接變磚。蘋果最后采取的修復策略是在隨后的固件更新中將時間禁止調整到2000年以前。


如果您看了本篇博客,覺得對您有所收獲,請點擊右下角的“推薦”,讓更多人看到!
資助Jack47寫作,打賞一個雞蛋灌餅吧
pay_weixin
微信打賞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM