程序中涉及到時間相關的概念,都比較繁瑣且易出錯。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