深入 JavaScript 時間對象 Date

程序中涉及到時間相關的概念,都比較繁瑣且易出錯。JavaScript中的瀏覽器內置的 Date 對象,相比較其他編程 簡單易用;相關方法一目瞭然。

1、Date 原型對象上的方法

Object.getOwnPropertyNames(Date.prototype) //注意這些方法都是不可枚舉的
["constructor", "toString", "toDateString", "toTimeString", "toISOString", "toUTCString", "toGMTString", "getDate", "setDate", "getDay", "getFullYear", "setFullYear", "getHours", "setHours", "getMilliseconds", "setMilliseconds", "getMinutes", "setMinutes", "getMonth", "setMonth", "getSeconds", "setSeconds", "getTime", "setTime", "getTimezoneOffset", "getUTCDate", "setUTCDate", "getUTCDay", "getUTCFullYear", "setUTCFullYear", "getUTCHours", "setUTCHours", "getUTCMilliseconds", "setUTCMilliseconds", "getUTCMinutes", "setUTCMinutes", "getUTCMonth", "setUTCMonth", "getUTCSeconds", "setUTCSeconds", "valueOf", "getYear", "setYear", "toJSON", "toLocaleString", "toLocaleDateString", "toLocaleTimeString"]

調用 Date 對象的 getter 方法:

function printDateTable() {
    let date = new Date();
    let tem = {};
    let dateMethodName = Object.getOwnPropertyNames(Date.prototype);
    let dateMethodGet = dateMethodName.filter(m => m.startsWith('to') || m.startsWith('get'));
    dateMethodGet.forEach(m => {
        let dateFormat = date[m].call(date);
        tem[m] = dateFormat;
    });
    console.table(tem);
    return tem;
}

 實際上,瞭解上述的方法,已經滿足大部分業務場景的需要了。值得注意,toString 方法與 toUTCString 方法返回的時間不同,這涉及到兩個概念。

2、時間標準與 Unix 時間戳

GMT 時間 即格林威治標準時間;這個時間系統的概念在 1884 年確立。

UTC 協調世界時;利用原子鐘計算時間與日期的系統。目前所有的國際通訊系統,衛星、航空、GPS 等,全部採用 UTC 時間。

Unix 時間戳;即自1970年1月1日(UTC)起經過的毫秒數。

通常將 GMT 和 UTC 視作等同。但 UTC 更加科學更加精確。

3、UTC 時間與本地時間

UTC 時間是世界統一時間,世界上同一時刻的 UTC 時間都是相同的,但相同的時刻具體到不同的地區、國家、時間是不一樣的,這就是本地時間。

4、JavaScript Date 構造函數參數

Date 構造函數接受四種類型的參數:

a、無參數的構造方法返回的實例,表示的是實例化時刻的日期和時間;

b、Unix 時間戳,返回的是表示 Unix 時間戳時刻的實例;

c、時間戳字符串,不同的瀏覽器與不同格式的字符串會導致解析差異;

d、多個表示日期時間格式的數字,如 new Date(2020, 5, 26, 18, 25);

5、Date 構造函數會根據接受的參數類型,自動判斷參數表示的是本地時間還是 UTC 時間;

a、無參數構造方法格式是唯一的,

返回的是表示現在時刻的對象,可以自由轉換成本地時間和 UTC 時間,在東八區,所以會相差8小時。

new Date()
Mon Jun 01 2020 14:42:13 GMT+0800 (中國標準時間)

b、Unix 時間戳會被解析成時間戳代表時刻的對象。

let timeStamp = new Date().getTime();
new Date(timeStamp);
Mon Jun 01 2020 14:50:06 GMT+0800 (中國標準時間)

c、時間戳字符串,字符串格式不同,解析的結果不同。

該字符串應該能被 Date.parse() 正確方法識別(即符合 IETF-compliant RFC 2822 timestamps 或 version of ISO8601)。

 

由於瀏覽器之間的差異與不一致性,強烈不推薦使用Date構造函數來解析日期字符串 (或使用與其等價的Date.parse)。對 RFC 2822 格式的日期僅有約定俗稱的支持。 對 ISO 8601 格式的支持中,僅有日期的串 (例如 "1970-01-01") 會被處理爲 UTC 而不是本地時間,與其他格式的串的處理不同。

常用時間字符串解析結果:

只有日期的格式:

function printDateFormat() {
    let dateFormat = ['2020-06-01', '2020/06/01', '2020 06 01', '20200601'];
    let dateTem = {};
    dateFormat.forEach(item => {
        dateTem[item] = new Date(item).toString();
    })
    console.table(dateTem);
}

 可以看到:

沒有分隔符分割的日期格式,無法被正確識別;
短線分割的日期格式,被處理成了 UTC 時間;
斜線、空格(其他符號分隔符)分割的日期,被處理成本地時間。

 日期時間格式:

function printDateTimeFormat() {
    let dateFormat = [
    'Tue Jun 02 2020 15:54:24 GMT+0800',
    '2020-06-02T07:54:24.271Z', 
    'Tue, 02 Jun 2020 07:54:24 GMT',
    '2020/6/2 下午3:54:24'
  ];
    let dateTem = {};
    dateFormat.forEach(item => {
        dateTem[item] = new Date(item).toString();
    })
    console.table(dateTem);
}

 可以看到:
1、第一種格式被解析成本地時間;
2、第二、三字符串格式被解析成UTC時間;
3、本地格式無法被正確解析(不符合ISO8601格式);

d:多個表示日期時間格式的數字會被解析成本地時間;

new Date(2020,6,2,15,29,30)
Thu Jul 02 2020 15:29:30 GMT+0800 (中國標準時間)

只傳日期數字,時間默認凌晨。(每個參數都有默認值,與主觀一致)

new Date(2020,6,2)
Thu Jul 02 2020 00:00:00 GMT+0800 (中國標準時間)

 

參考資料:

GMT與UTC簡介,https://www.cnblogs.com/tosee/p/5538007.html

MDN Date,https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章