摘要:構(gòu)造函數(shù)通過(guò)可以進(jìn)行實(shí)例化,得到一個(gè)對(duì)象實(shí)例,值得注意的是如果直接執(zhí)行,將得到一個(gè)時(shí)間字符串。依照此標(biāo)準(zhǔn),在此格式能被表示的最后時(shí)間是年月日,星期二。錯(cuò)誤的計(jì)算及動(dòng)作可能因此產(chǎn)生。
Date 是 JS 中的重要的一個(gè)內(nèi)置對(duì)象,其實(shí)例主要用于處理時(shí)間和日期,其時(shí)間基于 1970-1-1 (世界標(biāo)準(zhǔn)時(shí)間)起的毫秒數(shù),時(shí)間戳長(zhǎng)度為 13 位(不同于 Unix 時(shí)間戳的長(zhǎng)度 10 位)。對(duì)于日期和時(shí)間,我們有無(wú)數(shù)個(gè)使用場(chǎng)景,因此需要特別注意一些細(xì)節(jié)和約定。
1. 構(gòu)造函數(shù)通過(guò) new Date() 可以進(jìn)行實(shí)例化,得到一個(gè) Date 對(duì)象實(shí)例,值得注意的是如果直接執(zhí)行 Date() ,將得到一個(gè)時(shí)間字符串。
new Date(); new Date(value); new Date(dateString); new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
其中對(duì)構(gòu)造函數(shù)的參數(shù)說(shuō)明(參考 MDN ):
如果沒(méi)有輸入任何參數(shù),則Date的構(gòu)造器會(huì)依據(jù)系統(tǒng)設(shè)置的當(dāng)前時(shí)間來(lái)創(chuàng)建一個(gè)Date對(duì)象。
如果提供了至少兩個(gè)參數(shù),其余的參數(shù)均會(huì)默認(rèn)設(shè)置為1(如果沒(méi)有提供day參數(shù))或者0。
JavaScript的時(shí)間是由世界標(biāo)準(zhǔn)時(shí)間(UTC)1970年1月1日開(kāi)始,用毫秒計(jì)時(shí),一天由86,400,000毫秒組成。Date對(duì)象的范圍是-100,000,000天至100,000,000天(等效的毫秒值)。
JavaScript的Date對(duì)象為跨平臺(tái)提供了統(tǒng)一的行為。時(shí)間屬性可以在不同的系統(tǒng)中表示相同的時(shí)刻,而如果使用了本地時(shí)間對(duì)象,則反映當(dāng)?shù)氐臅r(shí)間。
JavaScript 的Date對(duì)象提供了數(shù)個(gè)UTC時(shí)間的方法,也相應(yīng)提供了當(dāng)?shù)貢r(shí)間的方法。UTC,也就是我們所說(shuō)的格林威治時(shí)間,指的是time中的世界時(shí)間標(biāo)準(zhǔn)。而當(dāng)?shù)貢r(shí)間則是指執(zhí)行JavaScript的客戶(hù)端電腦所設(shè)置的時(shí)間。
以一個(gè)函數(shù)的形式來(lái)調(diào)用JavaScript的Date對(duì)象(i.e., 不使用 new 操作符)會(huì)返回一個(gè)代表當(dāng)前日期和時(shí)間的字符串。
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]
不支持帶 "-" 的完整時(shí)間,比如 new Date("2012-07-08 00:00:00") 為無(wú)效的值,而 new Date("2012-07-08") 是正確的值。
[month]
new Date(year, month, ……) 中的month從0開(kāi)始計(jì)算
4. 值的邊界不同執(zhí)行環(huán)境下的邊界值有差異, Chrome 下甚至連負(fù)值都能支持。在實(shí)際生產(chǎn)環(huán)境中,不僅需要考慮時(shí)間的展示,還需要考慮其存儲(chǔ)、計(jì)算等,因此在特定的場(chǎng)景下,我們需要盡可能考慮到數(shù)據(jù)庫(kù)和瀏覽器中 Date 的有效范圍。
以數(shù)據(jù)庫(kù) Derby 存儲(chǔ)時(shí)間為例,其邊界為:
說(shuō)明 | 邊界值 |
---|---|
最小的日期 | 0001-01-01 |
最大的日期 | 9999-12-31 |
最小的時(shí)間 | 00:00:00 |
最大的時(shí)間 | 24:00:00 |
最小的時(shí)間戳 | 0001-01-01-00.00.00.000000 |
最大的時(shí)間戳 | 9999-12-31-23.59.59.999999 |
在 mysql 中,其范圍定義為 1000-01-01to9999-12-31;
在 js 中,時(shí)間戳的最小值為 -8640000000000000 即公元前 271,821 年 4 月 20 日,最大值為 8640000000000000,即 275,760 年 9 月 13 日。規(guī)范中時(shí)間范圍為 1970/1/1 前后 100,000,000 天。
聽(tīng)說(shuō),2038 年之后時(shí)間戳不夠用了。
在計(jì)算機(jī)應(yīng)用上,2038年問(wèn)題可能會(huì)導(dǎo)致某些軟件在2038年無(wú)法正常工作。所有使用UNIX時(shí)間表示時(shí)間的程序都將受其影響,因?yàn)樗鼈円宰?970年1月1日經(jīng)過(guò)的秒數(shù)(忽略閏秒)來(lái)表示時(shí)間。這種時(shí)間表示法在類(lèi)Unix(Unix-like)操作系統(tǒng)上是一個(gè)標(biāo)準(zhǔn),并會(huì)影響以其C編程語(yǔ)言開(kāi)發(fā)給其他大部份操作系統(tǒng)使用的軟件。在大部份的32位操作系統(tǒng)上,此“time_t”數(shù)據(jù)模式使用一個(gè)有正負(fù)號(hào)的32位元整數(shù)(signedint32)存儲(chǔ)計(jì)算的秒數(shù)。依照此“time_t”標(biāo)準(zhǔn),在此格式能被表示的最后時(shí)間是2038年1月19日03:14:07,星期二(UTC)。超過(guò)此一瞬間,時(shí)間將會(huì)被掩蓋(wrap around)且在內(nèi)部被表示為一個(gè)負(fù)數(shù),并造成程序無(wú)法工作,因?yàn)樗鼈儫o(wú)法將此時(shí)間識(shí)別為2038年,而可能會(huì)依個(gè)別實(shí)作而跳回1970年或1901年。錯(cuò)誤的計(jì)算及動(dòng)作可能因此產(chǎn)生。
實(shí)際上參考第 4 部分,Date 的上限綽綽有余,大家可以拿起手頭的設(shè)備測(cè)試一下 2038 年會(huì)出現(xiàn)怎樣的異狀。
6. 參考1、EmacScript 語(yǔ)言規(guī)范 - http://ecma-international.org/ecma-262/5.1/#sec-15.9
2、Mysql 時(shí)間范圍 - https://dev.mysql.com/doc/refman/5.5/en/datetime.html
3、JS 時(shí)間戳邊界 - https://stackoverflow.com/questions/11526504/minimum-and-maximum-date
moment - 重量級(jí)時(shí)間處理庫(kù),支持時(shí)間解析、格式化、計(jì)算等,功能強(qiáng)大,支持瀏覽器和 Node.js,壓縮后體積約為 16.3 KB
date-fns - 較 moment 更輕量級(jí)的事件處理庫(kù),體積更小
dayjs - 更輕量級(jí)的 moment.js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97692.html
摘要:實(shí)際上,一個(gè)完整的類(lèi)名就是包名與類(lèi)名的組合。例如一個(gè)文件內(nèi)容如下這表示和都屬于這個(gè)包,它們的完整類(lèi)名分別是和。包就是文件夾包代表的是一種樹(shù)形結(jié)構(gòu)的路徑,而在操作系統(tǒng)和壓縮包當(dāng)中,路徑都是以文件夾的形式展現(xiàn)的。 1. 為什么 Java 會(huì)有包的概念? 我們知道 Class(類(lèi))是 Java 中的一等公民,所有的 Java 代碼,都要寫(xiě)在類(lèi)里面。 我們也知道,在命名規(guī)則下,你可以給類(lèi)起任何...
摘要:線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。局部變量是線程安全的。有狀態(tài)對(duì)象,就是有實(shí)例變量的對(duì)象,可以保存數(shù)據(jù),是非線程安全的。 前言 有多少人在使用Spring框架時(shí),很多時(shí)候不知道或者忽視了多線程的問(wèn)題? ??因?yàn)閷?xiě)程序時(shí),或做單元測(cè)試時(shí),很難有機(jī)會(huì)碰到多線程的問(wèn)題,因?yàn)闆](méi)有那么容易模擬多線程測(cè)試的環(huán)境。那么當(dāng)多個(gè)線程調(diào)用同一個(gè)bean的時(shí)...
摘要:線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。局部變量是線程安全的。有狀態(tài)對(duì)象,就是有實(shí)例變量的對(duì)象,可以保存數(shù)據(jù),是非線程安全的。 前言 有多少人在使用Spring框架時(shí),很多時(shí)候不知道或者忽視了多線程的問(wèn)題? ??因?yàn)閷?xiě)程序時(shí),或做單元測(cè)試時(shí),很難有機(jī)會(huì)碰到多線程的問(wèn)題,因?yàn)闆](méi)有那么容易模擬多線程測(cè)試的環(huán)境。那么當(dāng)多個(gè)線程調(diào)用同一個(gè)bean的時(shí)...
摘要:結(jié)果如下打開(kāi)試試下一步,我們將把組件功能自己設(shè)置定時(shí)器并且能每秒更新。這是一個(gè)設(shè)置定時(shí)器的好地方注意我們是怎么保存定時(shí)器的。我們將在這個(gè)生命周期的函數(shù)方法中卸載掉定時(shí)器最后,我們會(huì)每一秒跑方法。 下面是react官方文檔的個(gè)人翻譯,如有翻譯錯(cuò)誤,請(qǐng)多多指出原文地址:https://facebook.github.io/re... Consider the ticking clock e...
閱讀 3708·2021-09-22 15:28
閱讀 1329·2021-09-03 10:35
閱讀 903·2021-09-02 15:21
閱讀 3510·2019-08-30 15:53
閱讀 3520·2019-08-29 17:25
閱讀 596·2019-08-29 13:22
閱讀 1583·2019-08-28 18:15
閱讀 2309·2019-08-26 13:57