JavaScript 時間與日期處理實戰:你確定被坑過

轉載自:http://web.jobbole.com/89120/javascript

本部分的知識圖譜請參考編程語言知識圖譜-時間與日期
83517123-5835b547b3165_articlexcss

本文JavaScript 時間與日期處理實戰:你確定被坑過從屬於筆者的Web 前端入門與最佳實踐中 JavaScript 入門與最佳實踐系列文章。html

JavaScript DateTime

標準時間

GMT即「格林威治標準時間」(Greenwich Mean Time,簡稱G.M.T.),指位於英國倫敦郊區的皇家格林威治天文臺的標準時間,由於本初子午線被定義爲經過那裏的經線。然而因爲地球的不規則自轉,致使GMT時間有偏差,所以目前已不被看成標準時間使用。UTC是最主要的世界時間標準,是通過平均太陽時(以格林威治時間GMT爲準)、地軸運動修正後的新時標以及以「秒」爲單位的國際原子時所綜合精算而成的時間。UTC比GMT來得更加精準。其偏差值必須保持在0.9秒之內,若大於0.9秒則由位於巴黎的國際地球自轉事務中央局發佈閏秒,使UTC與地球自轉週期一致。不過平常使用中,GMT與UTC的功能與精確度是沒有差異的。協調世界時區會使用「Z」來表示。而在航空上,全部使用的時間劃一規定是協調世界時。並且Z在無線電中應讀做「Zulu」(可參見北約音標字母),協調世界時也會被稱爲「Zulu time」。前端

TimeZone&UTC Offsets:時區與偏移

人們常常會把時區與UTC偏移量搞混,UTC偏移量表明瞭某個具體的時間值與UTC時間之間的差別,一般用HH:mm形式表述。而TimeZone則表示某個地理區域,某個TimeZone中每每會包含多個偏移量,而多個時區可能在一年的某些時間有相同的偏移量。譬如America/Chicago, America/Denver, 以及 America/Belize在一年中不一樣的時間都會包含 -06:00 這個偏移。java

時間戳

Unix時間戳表示當前時間到1970年1月1日00:00:00 UTC對應的秒數。注意,JavaScript內的時間戳指的是當前時間到1970年1月1日00:00:00 UTC對應的毫秒數,和unix時間戳不是一個概念,後者表示秒數,差了1000倍。git

時間數字字符串格式

RFC2822

ISO 8601

國際標準化組織的國際標準ISO 8601是日期和時間的表示方法,全稱爲《數據存儲和交換形式·信息交換·日期和時間的表示方法》。目前最新爲第三版ISO8601:2004,初版爲ISO8601:1988,第二版爲ISO8601:2000。年由4位數組成,以公曆公元1年爲0001年,以公元前1年爲0000年,公元前2年爲-0001年,其餘以此類推。應用其餘紀年法要換算成公曆,但若是發送和接受信息的雙方有共同一致贊成的其餘紀年法,能夠自行應用。github

Reference

Date

JavaScript爲咱們提供了不是很好用的Date對象做爲時間日期對象,Date()直接返回當前時間字符串,無論參數是number仍是任何string。而new Date()則是會根據參數來返回對應的值,無參數的時候,返回當前時間的字符串形式;有參數的時候返回參數所對應時間的字符串。new Date()對參數不論是格式仍是內容都要求,且只返回字符串,標準的構造Date對象的方法有:web

這裏須要注意的是,月份month參數,其計數方式從0開始,而天day參數,其計數方式從1開始chrome

Parse:解析

TimeStamp:時間戳

若是須要從當前的時間對象獲取其相應的時間戳,咱們可使用getTime或者valueOf(),返回距離1970年1月1日0點的毫秒數:npm

另外Date對象還有一個靜態方法一樣返回給定日期的毫秒數。但其參數並非一個字符串,而是分別表明年、月、日、時、分、秒、毫秒的數字參數:

仍是須要強調下,JavaScript內的時間戳指的是當前時間到1970年1月1日00:00:00 UTC對應的毫秒數,和unix時間戳不是一個概念,後者表示秒數,差了1000倍。new Date(timestamp)中的時間戳必須是number格式,string會返回Invalid Date。因此好比new Date('11111111')這種寫法是錯的。

DateTimeString:時間日期字符串

JavaScript原生Date對於時間字符串的解析真的是槽點滿滿,假設咱們但願以DD/MM/YYYY的格式進行解析,那麼它是沒法識別的:

另外,在ES5的標準中,其對ISO 8601標準的字符串進行了一個神奇的斷言:全部沒有提供時區的字符串默認爲標準時區。換言之,你會發現你解析出來的時間和你預期中的不同,並且它打印的時候是按照本地時區又進行了轉換:

ES 2015標準中則是修復了該Bug,不過仍是會讓人以爲頭大,畢竟你不知道你代碼的最終運行環境會是ES5仍是ES6。Date對象也有一個parse方法,用於解析一個日期字符串,參數是一個包含待解析的日期和時間的字符串,返回從1970年1月1日0點到給定日期的毫秒數。該方法會根據日期時間字符串格式規則來解析字符串的格式,除了標準格式外,如下格式也支持。若是字符串沒法識別,將返回NaN。

  • ‘月/日/年’ 如6/13/2004
  • ‘月 日,年’ 如January 12,2004或Jan 12,2004
  • ‘星期 月 日 年 時:分:秒 時區’ Tue May 25 2004 00:00:00 GMT-0700

在ECMAScript5中,若是使用標準的日期時間字符串格式規則的字符串中,數學前有前置0,則會解析爲UTC時間,時間沒有前置0,則會解析爲本地時間。其餘狀況通常都會解析爲本地時間

Manipulate:時間對象操做

Get&Set

Date對象提供了一系列get*方法,用來獲取實例對象某個方面的值。具體的Get函數列表詳見附錄:

一樣的,Date對象還提供了一系列的Set方法:

Add&Subtract

咱們能夠巧用Set方法的特性,set*方法的參數都會自動折算。以setDate爲例,若是參數超過當月的最大天數,則向下一個月順延,若是參數是負數,表示從上個月的最後一天開始減去的天數。

Diff:計算差值

類型轉換時,Date對象的實例若是轉爲數值,則等於對應的毫秒數;若是轉爲字符串,則等於對應的日期字符串。因此,兩個日期對象進行減法運算,返回的就是它們間隔的毫秒數;進行加法運算,返回的就是鏈接後的兩個字符串。

Display:時間展現

Format:格式化

Date對象提供了一系列的to*方法來支持從Date對象轉化爲字符串,具體的函數列表詳見附錄:

Durations:時長

i18n:國際化

瀏覽器獲取當前用戶所在的時區等信息只和系統的日期和時間設置裏的時區以及時間有關。區域和語言設置影響的是瀏覽器默認時間函數(Date.prototype.toLocaleString等)顯示的格式,不會對時區等有影響。Date有個Date.prototype.toLocaleString()方法能夠將時間字符串返回用戶本地字符串格式,這個方法還有兩個子方法Date.prototype.toLocaleDateString和Date.prototype.toLocaleTimeString,這兩個方法返回值分別表示日期和時間,加一塊兒就是Date.prototype.toLocaleString的結果。這個方法的默認參數會對時間字符串作一次轉換,將其轉換成用戶當前所在時區的時間,並按照對應的系統設置時間格式返回字符串結果。然而不一樣瀏覽器對用戶本地所使用的語言格式的判斷依據是不一樣的。

  • IE:獲取系統當前的區域和語言-格式中設置的格式,依照其對應的格式來顯示當前時間結果;IE瀏覽器實時查詢該系統設置(即你在瀏覽器窗口打開後去更改系統設置也會引發返回格式變化)。假設系統語言爲 ja-JP,系統unicode語言爲zh-CN日期格式爲nl-NL,瀏覽器語言設置(accept-language)爲de,瀏覽器界面語言爲en-US(其餘條件不變,瀏覽器界面語言改成zh-CN的時候結果也是同樣),
  • FF:獲取方式和結果與IE瀏覽器相同,區別在於FF只會在瀏覽器進程第一次啓動的時候獲取一次系統設置,中間無論怎麼系統設置怎麼變化,FF都沒法獲取到當前系統設置。除非重啓FF瀏覽器。當瀏覽器界面語言爲zh-CN,accept-language首位爲en-US的時候:
  • Chrome:獲取方式和以上兩個都不一樣。chrome無視系統的區域和語言-格式格式,只依照本身瀏覽器的界面設置的菜單語言來處理。(好比英文界面則按系統’en-US’格式返回字符串,中文界面則按系統’zh-CN’格式返回結果)。當瀏覽器界面語言爲zh-CN,accept-language首位爲en-US的時候:

Calendar:日曆操做

Moment.js

57395441-5835b4de3ac5e_articlex

Moment.js爲JavaScript Date對象提供了封裝與統一好的API接口,而且提供了更多的功能。首先須要瞭解的是,Moment提供的moment對象是可變的,即當咱們對該對象執行相似於增減或者設置的時候,其對象自己的值會發生變化,譬以下面這段代碼:

而若是咱們不但願改變原有的值,特別是在須要建立多個時間日期對象的時候,咱們能夠利用clone方法:

筆者是習慣在Webpack中進行打包,相似於Node下的安裝方式:

若是你須要引入某個語言包,那麼能夠用以下方式:

Parse

TimeStamp

DateTimeString

Manipulate

Get/Set

Add&Subtract

Comparison

Diff

Display

Format

Relative Format

Duration

i18n

附錄

Date APIs

Date 對象用於處理日期和時間。其核心的方法以下列表所示:

方法 描述
Date() 返回當日的日期和時間。
getDate() 從 Date 對象返回一個月中的某一天 (1 ~ 31)。
相關文章
相關標籤/搜索