你可能不知道的 Date 類

Date 是 JS 中的重要的一個內置對象,其實例主要用於處理時間和日期,其時間基於 1970-1-1 (世界標準時間)起的毫秒數,時間戳長度爲 13 位(不一樣於 Unix 時間戳的長度 10 位)。對於日期和時間,咱們有無數個使用場景,所以須要特別注意一些細節和約定。html

1. 構造函數

經過 new Date() 能夠進行實例化,獲得一個 Date 對象實例,值得注意的是若是直接執行 Date() ,將獲得一個時間字符串。mysql

new Date();
new Date(value);
new Date(dateString);
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);

<!-- more -->git

其中對構造函數的參數說明(參考 MDN ):github

  • 若是沒有輸入任何參數,則Date的構造器會依據系統設置的當前時間來建立一個Date對象。
  • 若是提供了至少兩個參數,其他的參數均會默認設置爲1(若是沒有提供day參數)或者0。
  • JavaScript的時間是由世界標準時間(UTC)1970年1月1日開始,用毫秒計時,一天由86,400,000毫秒組成。Date對象的範圍是-100,000,000天至100,000,000天(等效的毫秒值)。
  • JavaScript的Date對象爲跨平臺提供了統一的行爲。時間屬性能夠在不一樣的系統中表示相同的時刻,而若是使用了本地時間對象,則反映當地的時間。
  • JavaScript 的Date對象提供了數個UTC時間的方法,也相應提供了當地時間的方法。UTC,也就是咱們所說的格林威治時間,指的是time中的世界時間標準。而當地時間則是指執行JavaScript的客戶端電腦所設置的時間。
  • 以一個函數的形式來調用JavaScript的Date對象(i.e., 不使用 new 操做符)會返回一個表明當前日期和時間的字符串。

2. 空值處理

// 以chrome爲例
new Date();
// Mon Oct 23 2017 23:38:02 GMT+0800 (CST)

new Date(false);
// Thu Jan 01 1970 08:00:00 GMT+0800 (CST)

new Date(0);
// Thu Jan 01 1970 08:00:00 GMT+0800 (CST)

new Date(null);
// Thu Jan 01 1970 08:00:00 GMT+0800 (CST)

new Date('');
// Invalid Date

new Date(undefined);
// Invalid Date

3. 特別提示

[Firefox]sql

不支持帶 '-' 的完整時間,好比 new Date('2012-07-08 00:00:00') 爲無效的值,而 new Date('2012-07-08') 是正確的值。chrome

[month]數據庫

  • new Date(year, month, ……) 中的month從0開始計算

4. 值的邊界

不一樣執行環境下的邊界值有差別, Chrome 下甚至連負值都能支持。在實際生產環境中,不只須要考慮時間的展現,還須要考慮其存儲、計算等,所以在特定的場景下,咱們須要儘量考慮到數據庫和瀏覽器中 Date 的有效範圍。編程

以數據庫 Derby 存儲時間爲例,其邊界爲:瀏覽器

說明 邊界值
最小的日期 0001-01-01
最大的日期 9999-12-31
最小的時間 00:00:00
最大的時間 24:00:00
最小的時間戳 0001-01-01-00.00.00.000000
最大的時間戳 9999-12-31-23.59.59.999999

mysql 中,其範圍定義爲 1000-01-01to9999-12-31
js 中,時間戳的最小值爲 -8640000000000000 即公元前 271,821 年 4 月 20 日,最大值爲 8640000000000000,即 275,760 年 9 月 13 日。規範中時間範圍爲 1970/1/1 先後 100,000,000 天。編程語言

5. 2038 年蟲

據說,2038 年以後時間戳不夠用了。

在計算機應用上,2038年問題可能會致使某些軟件在2038年沒法正常工做。全部使用UNIX時間表示時間的程序都將受其影響,由於它們以自1970年1月1日通過的秒數(忽略閏秒)來表示時間。這種時間表示法在類Unix(Unix-like)操做系統上是一個標準,並會影響以其C編程語言開發給其餘大部份操做系統使用的軟件。在大部份的32位操做系統上,此「time_t」數據模式使用一個有正負號的32位元整數(signedint32)存儲計算的秒數。依照此「time_t」標準,在此格式能被表示的最後時間是2038年1月19日03:14:07,星期二(UTC)。超過此一瞬間,時間將會被掩蓋(wrap around)且在內部被表示爲一個負數,並形成程序沒法工做,由於它們沒法將此時間識別爲2038年,而可能會依個別實做而跳回1970年或1901年。錯誤的計算及動做可能所以產生。

實際上參考第 4 部分,Date 的上限綽綽有餘,你們能夠拿起手頭的設備測試一下 2038 年會出現怎樣的異狀。

6. 參考

一、EmacScript 語言規範 - http://ecma-international.org/ecma-262/5.1/#sec-15.9
二、Mysql 時間範圍 - https://dev.mysql.com/doc/refman/5.5/en/datetime.html
三、JS 時間戳邊界 - https://stackoverflow.com/questions/11526504/minimum-and-maximum-date

7. 庫

  • moment - 重量級時間處理庫,支持時間解析、格式化、計算等,功能強大,支持瀏覽器和 Node.js,壓縮後體積約爲 16.3 KB
  • date-fns - 較 moment 更輕量級的事件處理庫,體積更小
  • dayjs - 更輕量級的 moment.js
相關文章
相關標籤/搜索