首頁  >  文章  >  web前端  >  Javascript中的時間

Javascript中的時間

高洛峰
高洛峰原創
2016-11-08 14:23:421320瀏覽

我們在程式設計時,不可避免地會和時間打交道。 例如要完成一次秒殺活動, 就會牽涉到時間存取,時間同步和時間差值計算等諸多細節。一個JavsScript的簡單例子,當我們在瀏覽器控制台輸入new Date(), 會得到以下結果:

Sun Oct 30 2016 16:27:04 GMT+0800 (CST)

輸出前半部分容易理解, 它代表的是2016年10月30日星期日,下午16點27分04秒, 後半部分的GMT,+0800, CST到底代表什麼呢, 本著一探究竟的想法, 本文來帶大家詳細了解下JS中的時間。

1.時間的表示

在古代, 天文學的一個最重要任務就是度量時間,制定曆法。我國古代將一年分為十二月、二十四節氣,一天分為十二個時辰,目的就是為了一套高效的時間表示方法用以指導農耕。隨著現代社會的發展,時間的表示也需要一套更科學精確的方法。

度量

從計時工具說起

遠古時代,人類是根據太陽與地球的角度變化來作息的, 人們都是日出而作, 日落而息, 人類一直遵循著這種延續下來的作息規律。這時的人們對於時間沒有特別的概念,也不用計時工具。

在中國周代,人們將一天分為12個時辰:子、醜、寅、卯、辰、巳、午、未、申、酉、戊、亥,分別對應夜半、雞鳴、平旦、日出、食時、隅中、日中、日昳、晡時、日入、黃昏、人定。用來指導人們一天的生活規律。這時,我們用沙漏、日晷來記錄大致的時間,可以區別出來的最短時間是1個時辰(2h)。

後來,工業革命將人類帶入了工業時代,此時人們對於時間有了更精細的劃分,一天被分為12個小時, 每小時60分, 每分60秒。為了更有效率地生產,我們用鐘錶來記錄時間,我們對於時間的使用也達到了秒級。

而現在,我們的計時工具已經升級成了冷原子鐘。 例如我國的北斗導航衛星系統使用的就是原子鐘來記錄時間,其計時精度已達到奈秒等級(1ns=10^-9s)。我們已將空間和時間結合到了一起,可以透過時間來推算空間,在空間中轉換時間。

ps: 曾經在園區聽過中科院博導徐穎關於北斗的演講, 不禁為人類的創造力和中國的強大國力所折服。

隨著人類文明的進步,計時工具也不斷地發展。借助這些工具,人類對於時間的劃分越來越細, 對於時間資源的使用率也越來越高。

時間單位

我們用時間單位來表達特定的時間間隔,常用的時間單位如: 世紀、年、季度、月、日、小時、分、 秒、 毫秒、微妙、奈秒等。目前人類可以測量的最短的時間單位是阿秒(attosecond),為中性π介子的壽命, 相當於10^-18 秒。

可以說,人們時間的細分過程和標準制定過程,其實是人類探索時間,利用時間的過程。 我們對於時間單位的認知,可以從側面反映我們對自己所處的時空的認知。時間單位也折射出人類科學文明的發展歷程。

時刻

我們平常常說,現在9點鐘了, 其實指的就是時刻。我們要表達的是目前已經達到9點這個時間點了。它是既沒有大小也沒有方向的,它只表達一個具體的時間點。 就好比我們用尺來衡量長度, 我們也在用一把標記著秒,小時的「尺」來衡量時間。而時刻,只是我們都可理解的尺上的某一個刻度。唯一的差異是, 空間中的長度通常是不變的, 而時間永遠是不可逆地增加的。

2. 時間標準化

首先,我們應認識到,在整個宇宙中, 時間是統一的。 從宇宙的誕生到現在, 總是可以用一個特定的時間間隔值來表示我們所經歷的時間,它是一個固定的值。 那我們不禁會問為什麼會說我們這裡是早上9點,而英國那邊確是凌晨1點呢,這不是兩個不同的時間嗎?這就要引出我們下面將要提到的時間標準問題。

在以前,人類的活動範圍相對狹小,基本上不會注意到時區對於人類作息的影響。我們完全想像不到, 當我們在陽光下辛勤工作的時候, 地球另一面的人們早已進入夢鄉。

但是工業革命之後,人類的生產和交通工具不斷進步,全球化協作成為不可阻擋的潮流。 此時人們已經意識到了地球在不停地自西向東自轉, 自轉一周則為一日。而不同經度的地區日出的時間是有先後差異的。例如中國北京還是正午的時候,大洋彼岸的美國紐約正好是深夜。早上8點我們一個電話打過去, 說美國的XXX, 該上班了, 對方一定是一臉的迷(meng)茫(bi), 我這準備洗洗睡呢。

正是人們認識到地球自轉的天文規律,才需要製定一套全球統一的時間標準,這樣,我們根據本地時間就可以推算出地球任何地區的當地時間(日出日落時間),以方便進行更好的協作。

格林尼治平時(Greenwich Mean Time, GMT)

格林尼治是位於英國倫敦郊區的皇家格里尼治天文台, 我們常說的格林尼治時間指的就是以此地的時間為標準時間制定的一套時間計量系統。

為了準確地表示各地時間,1884年,國際經度會議決定將通過英國格林尼治天文埃里中星儀的經線定為計算經度的起算經線,稱為本初子午線。以本初子午線的平子夜起算的平太陽時,分別向東、西計量增減12時,作為統一的時間標準,稱為格林尼治平時。這也就是GMT時間的由來,它是根據地球的自轉所定義的一套時間標準,其對於日常生活, 天文導航和宇宙飛行等人類活動具有重要作用。

GMT的製定同時也產生了時區的概念。我們在聽關於國外的新聞報道的時候,常常會聽到於當地時間XX時XX分,本地時間yy時yy分發生了什麼大事,然後是balabala。 這其實就是在時間的表示上避免位於不同時區的人對於時間理解的差異。

時區(Time Zone), 設定了一個區域的標準時間。 理論上, 以被15整除的子午線為中心, 向東西各延伸7.5經度,劃分為一個時區。實際上,由於各國的版圖不規則, 通常會跨越多個時區, 所以國家內部還會規定整個行政區域內的一個實際時區,稱為法定時區。例如中國, 從西到東橫跨東五、東六、東七、東八和東九五個時區, 中華人民共和國成立以後,全國統一採用首都北京所在的東八時區的區時作為標準時間,稱為北京時間。

協調世界時(Coordinated Universal Time, UTC)

UTC通常被誤認為是GMT, 其實兩者的表示方式完全不同。

UTC的由來

人類觀測到地球自轉的緩慢下降,地球自轉一周耗時經過一段時間後會多於現行的24小時,因此GMT時間已不再適合作為標準時間使用。現在的標準時間是由原子鐘報時的協調世界時,這是由國際計量局和國際地球自轉服務(IERS)維護的時間標度,是各標準頻率和時間信號協協調播發基準。

那為什麼又要搞個UTC呢,太亂了吧? 其實誰也不想這麼麻煩, 這是地球自己「轉」出來的。

我們常識性認為地球自轉一周是24小時,而由於地球自轉速度變慢,在經過了24h之後,地球可能還沒有成一周的運轉, 為了保證24h和地球完整的一周相匹配,就必須讓鐘錶上的時間等待地球自轉一周完成,這就是協調世界時中「協調」二字的含義。 UTC時間相較於國際原子鐘時間(International Atomic Time, TAI)實際上是慢的。

註:秒是基本的時間國際單位,國際上現在標準的1秒為:銫133原子基態的兩個超精細能階間躍遷對應的輻射的9,192,631,770個週期的持續時間

說白了,TAI時間是基於原子規律定義的時間,而這個時間長時間不會改變。 UTC是為了符合地球自轉週期所製定的時間, UTC會讓全球的鐘錶都停下來,補上地球自轉變慢的差值, 而矯正和同步機構就是IERS。全球所有國家根據UTC時間和各自國家所在的時區來確定當地時間,以確保全球時間的低誤差同步。

閏秒

UTC以加入閏秒(leap-secons)的方式對時間進行修正,以消除地球自轉變慢的影響。閏秒是為了平衡地球自轉變慢所引起的和原子鐘的時間差而刻意設定的。如果不加入閏秒,可能過幾萬年後,中午的12點會變成凌晨0點; 再過個幾百萬年,日曆上的冬天會變成了夏天了,那麼整個生產生活就會亂套了。

閏秒的引入時機是每年的6月和12月月末, 視UTC-TAI的演變差值而定,並且每隔六個月會公佈是否需要加入閏秒(這就是IERS幹的活兒) 。

上次閏秒的引入時間是UTC 2015-6-30 23:59:60 而下一次的閏秒引入會在:

2016-12-31 23:59:592016-12-31 2323 :602017-01-01 00:00:00

從2015-07-01 00:00:00 UTC 到2017-01-01 00:00:00 UTC 時間差異是: UTC -AI = -就是說,我們的UTC時間標準相較於真正的原子鐘時間,人為地慢了36秒。

PS1: 是不是覺得自己賺到了, 多活了36s呢! PS2: 人類目前所花的時間大多都已經是UTC時間了, 但是很多時候還保留著GMT的時區劃分規則,所以很多地方顯示的還是GMT時間。

北京時間(China Standard Time, CST)

再來說一下我國的時間基準, 北京時間不是在北京確定的,而是由位於中國版圖幾何中心位置陝西臨斃和陝西蒲城的中國科學院國家授時中心(國家授時台)的9台銫原子鐘(銫鐘)和2台氫原子鐘組透過精密比對和計算實現,並透過衛星與世界各國授時部門進行即時比對確定的。國內的設備可以透過國家授時中心提供的NTP(Network Time Protocol)伺服器和本地時間進行同步。具體使用可以參考此處。

在Mac上, 可以透過下列指令和製定的NTP伺服器進行校時:

➜ ~ sudo ntpdate -u cn.pool.ntp.org
1 Nov 03:20:08 ntpdate[84376]: adjust time server 59.46.44.253 offset 0.014804 sec
➜ ~

3. 小結

再回到文章最開始所提到的, new Date()在輸出數據, 所有的內容就清晰了:再回到文章最開始所提到的, new Date()在輸出數據, 所有的內容就清晰了:3: ,但此處的GMT所表示的意思是:時間使用的時區是GMT標準,時間採用的是UTC時間

+0800 代表的是當前時間和標準時間的時差, 精確到分。 +0800, 表示目前時間早於UTC時間8小時整

CST 指的是北京時間

done!

4. 後記

一門程式設計語言中有很多細節, 往往蘊含著極大的智慧。以本文提到的時間為例, 幾個簡單的單詞, 其中蘊含了人類近幾百年的科技文明發展成果,也反映了人類對於時間的尊重和敬畏,每一處都值得細細品味。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn