歡迎光臨
每天分享高質量文章

大話程式設計中的 time

(點選上方公眾號,可快速關註)


來源:koala bear,

wsfdl.com/algorithm/2016/11/18/理解time.html

最近在 time 方面踩坑數個,加上對各類時間名詞的含義含糊不清,遂在本文整理時間相關的名詞。

格林威治天文臺與格林威治時間(GMT)

格林威治皇家天文臺(Royal Observatory, Greenwich) 是英國國王查理二世於 1675 年在倫敦格林威治建造的一個綜合性天文臺,那時處於大航海時代,在當時遠洋航行意味著冒險:茫茫大洋上無法準確測量船隻所在的經度。所以國王建造天文臺並設立皇家天文學家的職位:“致力於以最忱治的關心和努力校正天體運動的星表,和恆星的位置,以便能正確的定出經度,使導航成為完美的藝術”。雖然格林威治天文臺並沒有解決航海經度的測量問題,但其名氣之大,一度成為最活躍的天文臺,如本初子午線就是經過該天文臺的 0 度經線。

顧名思義,格林威治標準時間(Greenwich Mean Time,GMT) 即指皇家格林威治天文臺的標準時間,自 1924 年 2 月 5 日開始,格林威治天文臺每隔一小時會向全世界發放調時資訊。理論上說,格林威治標準時間的正午是指當太陽橫穿格林威治子午線的時間,但是地球在橢圓軌道里運動速度不均勻,這個時刻可能與平太陽時有誤差,最大誤差達16分鐘。所以格林威治天文臺連續觀測 365 個長短不一的天,然後求平均值得到一天的長度,稱為平太陽日,即格林威治標準時間採用的是平太陽時間。

由於地球每天的自轉是不規則的,而且正在緩慢減速,因此格林威治時間已經不再被作為標準時間使用。現在的標準時間,是由原子鐘報時的協調世界時(UTC)。

原子時與協調世界時(UTC)

原子時是一種基於原子的時間,它以原子共振頻率標準來計算和保證時間的準確。原子時是世界上已知最準確的時間測量和頻率標準,也是國際時間和頻率轉換的基準。1967 年第 13 屆國際計量大會上透過一項決議,定義一秒(原子時秒)為銫-133 原子基態兩個超精細能級間躍遷輻射 9192631770 周所持續的時間。

協調世界時(Coordinated Universal Time, UTC) 又稱世界標準時間或世界協調時間,是目前最主要的世界時間標準。它以原子時的秒為基礎,和平太陽時相差不超過 1 秒,在時刻上儘量接近於格林威治標準時間。對於大多數用途來說,UTC 時間被認為能與 GMT 時間互換,但 GMT 時間已不再被科學界所確定。

協調世界時把時間分為天、小時、分鐘和秒,每天包含 24 小時,每小時包含 60 分鐘,一分鐘通常有 60 秒,但是分鐘加入了閏秒,所以一分鐘也可能是 61 秒或 59 秒。在 UTC 系統的時間尺度中,秒和比秒小的單位(毫秒、微秒等)其長度是固定的,但是對於分鐘和比分還大的單位(小時、天、周等),其長度是可變的。可採用 date -u 獲取 UTC 時間。

$ date -u

Mon Nov 20 09:15:20 UTC 2016

Localtime 與夏令時

各個國家分佈在地球的不同位置上,因此不同國家的日出、正午、日落時間可能有所偏差,在現實生活中,人們更關註本地時間,因為和 UTC 相比,本地時間更適合用於當地的生產和生活。1863 年,時區的概念被首次提出,它以區域為範圍設定標準時間,某地的本地時間通常指該地所在時區的標準時間。理論時區以被 15 整除的子午線為中心,向東西兩側延伸 7.5 度,即每 15 度劃分一個時區,這是理論時區。但是,為了避開國界線,有的時區的形狀並不規則,而且比較大的國家以國家內部行政分界線為時區界線,這是實際時區,即法定時區。

北京位於東八區,故其時區為 UTC+8,北京時間比格林威治標準時間早 8 小時,在不考慮夏令時的情況下,可用以下公式完成本地時間和 UTC 時間之間的轉換。

UTC + 時區差 = 本地時間

其中東半球時區威差為正,西半球時區差負

 

夏令時(Summer Time) 又稱日光節約時制或日光節約時間,是一種為節約能源而人為規定地方時間的制度。一般在天亮較早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。各個採納夏時制的國傢具體規定不同,目前全世界有近 110 個國家每年要實行夏令時,如美國、歐盟等;中國、日本等國家曾經實行過夏令時,但是目前不予實行。

Unix 時間

Unix 時間又稱 Posix 時間,它是 Unix 和 類 Unix 系統使用的表達方式,它指自 UTC 時間 1970 年 1 月 1 日 0 時 0 分 0 秒起值現在的總秒數,可用 date +%s 檢視 Unix 時間:

$ date +%s

1479655113

$

$ date -r 1479655113

Sun Nov 20 15:18:33 UTC 2016

由上可知,Unix 時間 1479655113 表示的日期為 Sun Nov 20 15:18:33 UTC 2016。

現在有些系統採用 32 位有符號整數儲存 Unix 時間,所以它最多隻能表示 136 年,即:1901-12-13 20:45:52 至 2038-1-19 3:14:07。和 千年蟲問題 類似,32 位 Unix/Linux 的系統在 2038 年可能會發生故障。

我們常用 NTP 協議校準計算機時間。

一點感想:軟體開發中,最好採用 UTC,分散式跨時區系統一定請用 UTC!

看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,提升Java技能

贊(0)

分享創造快樂