摘要:比如中國,從西到東橫跨東五東六東七東八和東九五個時區,中華人民共和國成立以后,全國統一采用首都北京所在的東八時區的區時作為標準時間,稱為北京時間。全球所有國家根據時間和各自國家所在的時區確定當地時間,以此來保證全球時間的低誤差同步。
我們在編程時,不可避免地會和時間打交道。 比如要完成一次秒殺活動, 就會涉及到時間存取,時間同步和時間差值計算等諸多細節。一個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點這個時間點了。它是既沒有大小也沒有方向的,它只表達一個具體的時間點。
就好比我們用尺子來衡量長度, 我們也在用一把標記著秒,小時的“尺子”來衡量時間。而時刻,只是我們都可理解的尺子上的某一個刻度。唯一的差別是, 空間中的長度通常是不變的, 而時間永遠是在是不可逆地增加的。
首先,我們應認識到,在整個宇宙中, 時間是統一的。 從宇宙的誕生到現在, 總是可以用一個特定的時間間隔值來表示我們所經歷的時間,它是一個固定的值。 那么我們不禁會問為什么會說我們這兒是早上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:59 2016-12-31 23:59:60 2017-01-01 00:00:00
從2015-07-01 00:00:00 UTC 到 2017-01-01 00:00:00 UTC 時間差異是: UTC - TAI = -36s. 也就是說,我們的UTC時間標準相較于真正的原子鐘時間,人為地慢了36秒。
北京時間(China Standard Time, CST)PS1: 是不是感覺自己賺到了, 多活了36s呢!
PS2: 人類當前所用的時間大多都已經是UTC時間了, 但是很多時候還保留著GMT的時區劃分規則,所以很多地方顯示的還是GMT時間。
再來說一下我國的時間基準, 北京時間不是在北京確定的,而是由位于中國版圖幾何中心位置陜西臨潼和陜西蒲城的中國科學院國家授時中心(國家授時臺)的9臺銫原子鐘(銫鐘)和2臺氫原子鐘組通過精密比對和計算實現,并通過衛星與世界各國授時部門進行實時比對確定的。國內的設備可以通過國家授時中心提供的NTP(Network Time Protocol)服務器和本地時間進行同步。具體使用可以參看此處。
在Mac上, 可以通過如下命令和制定的NTP服務器進行校時:
3. 小結? ~ 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
? ~
再回到文章最開始所提到的, new Date()在輸出數據, 所有的內容就清晰了:
GMT, 代表的格林尼治平時,但此處的GMT所表示的意思是:時間使用的時區是GMT標準,采用的是UTC時間
+0800 代表的是當前時間和標準時間的時差, 精確到分。+0800, 表示當前時間早于UTC時間8小時整
CST 指的是北京時間
done!
4. 后記一門程序設計語言中有很多細節, 往往蘊含著極大的智慧。以本文提到的時間為例, 幾個簡單的單詞, 其中蘊含了人類近幾百年的科技文明發展成果,也反映了人類對于時間的尊重和敬畏,每一處都值得細細品味。
原文:http://lianmin.me/2016/10/30/...
參考文獻[1] 閏秒(leap seconds): http://tycho.usno.navy.mil/le...
https://hpiers.obspm.fr/iers/...
[2] 日期和時間表示法(國標 GB/T 7408-2005) http://www.cmaph.org/attachme...
[3] 24小時制: https://zh.wikipedia.org/wiki...
[4]時間: https://zh.wikipedia.org/wiki...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80794.html
摘要:啟動性能瓶頸分析與解決方案翻譯自的,從屬于筆者的前端入門與工程實踐。我們必須要清醒地認識到全面評測以挖掘出真正性能瓶頸的重要性。這可能是最佳的方式了,類似于這樣的模式鼓勵基于路由的分組,目前被與廣泛使用。 JavaScript 啟動性能瓶頸分析與解決方案 翻譯自 Addy Osmani 的 JavaScript Start-up Performance,從屬于筆者的Web 前端入門與工...
摘要:注意客戶端與服務器日期進行傳輸的時候一般都是用大整數時間戳進行傳輸。 前言 一個網站的開發需要要UI、前端、后端三種工程師。現在的企業在招聘前端工程師的時候一般都要求其了解或者掌握一些后端的知識。因此,此文章主要介紹javascript的日期類型,也粗略的介紹一下php的日期類型,以及二者是如何交互數據的。 時間戳 什么是時間戳 時間戳是從格林威治時間1970年1月1日(00:0...
摘要:注意客戶端與服務器日期進行傳輸的時候一般都是用大整數時間戳進行傳輸。 前言 一個網站的開發需要要UI、前端、后端三種工程師。現在的企業在招聘前端工程師的時候一般都要求其了解或者掌握一些后端的知識。因此,此文章主要介紹javascript的日期類型,也粗略的介紹一下php的日期類型,以及二者是如何交互數據的。 時間戳 什么是時間戳 時間戳是從格林威治時間1970年1月1日(00:0...
摘要:一起來看看中的日期對象。對象和其他對象如等一樣,對象是語言中的內建對象。在工作中,對象有著許多重要的應用。這意味著,當前時間與標準時區相差小時。,全稱是國際標準化組織,負責制定全世界工商業國際標準的國際標準。 原文地址: http://www.wemlion.com/2016/d... 時間的發現 日常生活中,各種形式的時間字符到處都是。 時間觀念的產生,時間單位、計時工具的發明,給人...
摘要:引擎線程,也稱為內核,負責處理腳本程序,例如引擎。異步請求線程,也就是發出請求后,接收響應檢測狀態變更等都是這個線程管理的。為了解決這個問題,提出標準,允許腳本創建多個線程,但是子線程完全受主線程控制,且不得操作。 本文主要參閱了以下兩篇文章,對JS的Event Loop運行機制基礎知識進行了整理。從瀏覽器多進程到JS單線程,JS運行機制最全面的一次梳理JavaScript 運行機制詳...
摘要:嵌套對象成員會造成重大性能影響盡量少用。一般來說你可以通過這種方法提高代碼的性能將經常使用的對象成員數組項和域外變量存入局部變量中。在反復訪問的地方使用局部變量存放引用小心地處理集合因為他們表現出存在性總是對底層文檔重新查詢。 前言 本期我來給大家推薦的書是《高性能JavaScript》,在這本書中我們能夠了解 javascript 開發過程中的性能瓶頸,如何提升各方面的性能,包括代碼...
閱讀 1999·2023-04-25 16:53
閱讀 1441·2021-10-13 09:39
閱讀 605·2021-09-08 09:35
閱讀 1639·2019-08-30 13:03
閱讀 2120·2019-08-30 11:06
閱讀 1830·2019-08-30 10:59
閱讀 3188·2019-08-29 17:00
閱讀 2287·2019-08-23 17:55