試一試
const date1 = new Date("December 17, 1995 03:24:00");
// Sun Dec 17 1995 03:24:00 GMT...
const date2 = new Date("1995-12-17T03:24:00");
// Sun Dec 17 1995 03:24:00 GMT...
console.log(date1.getTime() === date2.getTime());
// Expected output: true
語法
new Date()
new Date(value)
new Date(dateString)
new Date(dateObject)
new Date(year, monthIndex)
new Date(year, monthIndex, day)
new Date(year, monthIndex, day, hours)
new Date(year, monthIndex, day, hours, minutes)
new Date(year, monthIndex, day, hours, minutes, seconds)
new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds)
Date()
引數
Date() 建構函式有五種基本形式
無引數
當不提供任何引數時,新建立的 Date 物件代表例項化時的當前日期和時間。返回日期的 時間戳 與 Date.now() 返回的數字相同。
時間值或時間戳數字
日期字串
dateString-
表示日期的字串值,使用與
Date.parse()相同的演算法進行解析和解釋。有關使用不同格式的注意事項,請參閱 日期時間字串格式。
日期物件
dateObject-
現有的
Date物件。這相當於複製現有的Date物件,具有相同的日期和時間。這等同於new Date(dateObject.valueOf()),只是沒有呼叫valueOf()方法。
當 Date() 建構函式傳遞一個引數時,Date 例項會得到特殊處理。所有其他值都會被 強制轉換為原始型別。如果結果是字串,它將被解析為日期字串。否則,結果的原始型別將進一步被強制轉換為數字,並被視為時間戳。
單獨的日期和時間元件值
提供至少一個年份和一個月份,此形式的 Date() 返回一個 Date 物件,其元件值(年、月、日、時、分、秒和毫秒)均來自以下引數。任何缺失的欄位都將使用最低可能值(day 為 1,其他所有元件為 0)。引數值均根據本地時區進行評估,而不是 UTC。 Date.UTC() 接受類似的引數,但將元件解釋為 UTC 並返回一個時間戳。
如果任何引數超出其定義的邊界,它將“進位”。例如,如果傳遞的 monthIndex 大於 11,則這些月份將導致年份增加;如果傳遞的 minutes 大於 59,則 hours 會相應增加,依此類推。因此,new Date(1990, 12, 1) 將返回 1991 年 1 月 1 日;new Date(2020, 5, 19, 25, 65) 將返回 2020 年 6 月 20 日凌晨 2:05。
同樣,如果任何引數低於下限,它將從較高位置“借位”。例如,new Date(2020, 5, 0) 將返回 2020 年 5 月 31 日。
年-
表示年份的整數值。0 到 99 的值對映到 1900 到 1999 年。所有其他值都是實際年份。請參閱 示例。
monthIndex-
表示月份的整數值,從 1 月的
0到 12 月的11。 day可選-
表示月份中的日期的整數值。預設為
1。 hours可選-
表示一天中小時的整數值,介於
0和23之間。預設為0。 minutes可選-
表示時間中分鐘部分的整數值。預設為
0。 seconds可選-
表示時間中秒部分的整數值。預設為
0。 milliseconds可選-
表示時間中毫秒部分的整數值。預設為
0。
返回值
呼叫 new Date()(Date() 建構函式)會返回一個 Date 物件。如果使用無效的日期字串呼叫,或者要構造的日期的時間戳小於 -8,640,000,000,000,000 或大於 8,640,000,000,000,000 毫秒,則會返回一個 無效日期(一個 Date 物件,其 toString() 方法返回 "Invalid Date",而 valueOf() 方法返回 NaN)。
呼叫 Date() 函式(不帶 new 關鍵字)會返回當前日期和時間的字串表示形式,與 new Date().toString() 的效果完全相同。在 Date() 函式呼叫(不帶 new 關鍵字)中提供的任何引數都會被忽略;無論它是使用無效的日期字串呼叫——甚至是用任何任意物件或其他原始型別作為引數呼叫——它始終返回當前日期和時間的字串表示形式。
描述
時間精度降低
為了提供針對定時攻擊和 指紋識別 的保護,new Date() 的精度可能會根據瀏覽器設定進行舍入。在 Firefox 中,預設啟用 privacy.reduceTimerPrecision 首選項,其預設值為 2ms。您也可以啟用 privacy.resistFingerprinting,在這種情況下,精度將為 100ms 或 privacy.resistFingerprinting.reduceTimerPrecision.microseconds 的值(以較大者為準)。
例如,在時間精度降低的情況下,new Date().getTime() 的結果將始終是 2 的倍數,或者在啟用 privacy.resistFingerprinting 時是 100(或 privacy.resistFingerprinting.reduceTimerPrecision.microseconds)的倍數。
// reduced time precision (2ms) in Firefox 60
new Date().getTime();
// Might be:
// 1519211809934
// 1519211810362
// 1519211811670
// …
// reduced time precision with `privacy.resistFingerprinting` enabled
new Date().getTime();
// Might be:
// 1519129853500
// 1519129858900
// 1519129864400
// …
示例
建立 Date 物件的幾種方法
以下示例展示了幾種建立 JavaScript 日期的方法
const today = new Date();
const birthday = new Date("December 17, 1995 03:24:00"); // DISCOURAGED: may not work in all runtimes
const birthday = new Date("1995-12-17T03:24:00"); // This is standardized and will work reliably
const birthday = new Date(1995, 11, 17); // the month is 0-indexed
const birthday = new Date(1995, 11, 17, 3, 24, 0);
const birthday = new Date(628021800000); // passing epoch timestamp
傳遞非 Date、非字串、非數字值
如果 Date() 建構函式使用了一個不是 Date 例項的引數進行呼叫,它將被強制轉換為原始型別,然後檢查是否為字串。例如,new Date(undefined) 與 new Date() 不同
console.log(new Date(undefined)); // Invalid Date
這是因為 undefined 已經是原始型別但不是字串,所以它將被強制轉換為數字,即 NaN,因此不是有效的時間戳。另一方面,null 會被強制轉換為 0。
console.log(new Date(null)); // 1970-01-01T00:00:00.000Z
陣列 會透過 Array.prototype.toString() 強制轉換為字串,該方法將元素用逗號連線起來。但是,任何包含多個元素的陣列生成的字串都不是有效的 ISO 8601 日期字串,因此其解析行為將由實現定義。請勿將陣列傳遞給 Date() 建構函式。
console.log(new Date(["2020-06-19", "17:13"]));
// 2020-06-19T17:13:00.000Z in Chrome, since it recognizes "2020-06-19,17:13"
// "Invalid Date" in Firefox
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-date-constructor |
瀏覽器相容性
載入中…