摘要:構造函數通過可以進行實例化,得到一個對象實例,值得注意的是如果直接執行,將得到一個時間字符串。依照此標準,在此格式能被表示的最后時間是年月日,星期二。錯誤的計算及動作可能因此產生。
Date 是 JS 中的重要的一個內置對象,其實例主要用于處理時間和日期,其時間基于 1970-1-1 (世界標準時間)起的毫秒數,時間戳長度為 13 位(不同于 Unix 時間戳的長度 10 位)。對于日期和時間,我們有無數個使用場景,因此需要特別注意一些細節和約定。
1. 構造函數通過 new Date() 可以進行實例化,得到一個 Date 對象實例,值得注意的是如果直接執行 Date() ,將得到一個時間字符串。
new Date(); new Date(value); new Date(dateString); new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
其中對構造函數的參數說明(參考 MDN ):
如果沒有輸入任何參數,則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 Date3. 特別提示
[Firefox]
不支持帶 "-" 的完整時間,比如 new Date("2012-07-08 00:00:00") 為無效的值,而 new Date("2012-07-08") 是正確的值。
[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 天。
聽說,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. 參考1、EmacScript 語言規范 - http://ecma-international.org/ecma-262/5.1/#sec-15.9
2、Mysql 時間范圍 - https://dev.mysql.com/doc/refman/5.5/en/datetime.html
3、JS 時間戳邊界 - https://stackoverflow.com/questions/11526504/minimum-and-maximum-date
moment - 重量級時間處理庫,支持時間解析、格式化、計算等,功能強大,支持瀏覽器和 Node.js,壓縮后體積約為 16.3 KB
date-fns - 較 moment 更輕量級的事件處理庫,體積更小
dayjs - 更輕量級的 moment.js
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97692.html
摘要:實際上,一個完整的類名就是包名與類名的組合。例如一個文件內容如下這表示和都屬于這個包,它們的完整類名分別是和。包就是文件夾包代表的是一種樹形結構的路徑,而在操作系統和壓縮包當中,路徑都是以文件夾的形式展現的。 1. 為什么 Java 會有包的概念? 我們知道 Class(類)是 Java 中的一等公民,所有的 Java 代碼,都要寫在類里面。 我們也知道,在命名規則下,你可以給類起任何...
摘要:線程安全問題都是由全局變量及靜態變量引起的。常量始終是線程安全的,因為只存在讀操作。局部變量是線程安全的。有狀態對象,就是有實例變量的對象,可以保存數據,是非線程安全的。 前言 有多少人在使用Spring框架時,很多時候不知道或者忽視了多線程的問題? ??因為寫程序時,或做單元測試時,很難有機會碰到多線程的問題,因為沒有那么容易模擬多線程測試的環境。那么當多個線程調用同一個bean的時...
摘要:線程安全問題都是由全局變量及靜態變量引起的。常量始終是線程安全的,因為只存在讀操作。局部變量是線程安全的。有狀態對象,就是有實例變量的對象,可以保存數據,是非線程安全的。 前言 有多少人在使用Spring框架時,很多時候不知道或者忽視了多線程的問題? ??因為寫程序時,或做單元測試時,很難有機會碰到多線程的問題,因為沒有那么容易模擬多線程測試的環境。那么當多個線程調用同一個bean的時...
摘要:結果如下打開試試下一步,我們將把組件功能自己設置定時器并且能每秒更新。這是一個設置定時器的好地方注意我們是怎么保存定時器的。我們將在這個生命周期的函數方法中卸載掉定時器最后,我們會每一秒跑方法。 下面是react官方文檔的個人翻譯,如有翻譯錯誤,請多多指出原文地址:https://facebook.github.io/re... Consider the ticking clock e...
閱讀 3672·2021-09-22 15:28
閱讀 1296·2021-09-03 10:35
閱讀 878·2021-09-02 15:21
閱讀 3474·2019-08-30 15:53
閱讀 3496·2019-08-29 17:25
閱讀 569·2019-08-29 13:22
閱讀 1555·2019-08-28 18:15
閱讀 2287·2019-08-26 13:57