Get to know MDN better
此頁面由社群從英文翻譯而來。了解更多並加入 MDN Web Docs 社群。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
JavaScript 的 Date 物件以平台獨立的格式表示一個特定的時間點。Date 物件封裝了一個整數,代表自 1970 年 1 月 1 日 00:00:00 UTC(紀元)以來的毫秒數。
JavaScript 日期基本上被指定為自紀元以來經過的毫秒數,紀元被定義為 1970 年 1 月 1 日 00:00:00 UTC 的午夜(相當於 UNIX 紀元)。這個時間戳是時區無關的,並唯一地定義了歷史上的一個瞬間。
備註:雖然 Date 物件核心的時間值是 UTC,但獲取日期和時間或其元件的基本方法都在本地(即主機系統)時區和偏移量下運作。
Date 物件可表示的最大時間戳略小於最大安全整數(Number.MAX_SAFE_INTEGER,即 9,007,199,254,740,991)。Date 物件相對於紀元最多可以表示 ±8,640,000,000,000,000 毫秒,或 ±100,000,000(一億)天。這個範圍是從西元前 271821 年 4 月 20 日到西元 275760 年 9 月 13 日。任何試圖表示此範圍之外時間的嘗試,都會導致 Date 物件持有一個值為 NaN 的時間戳,這是一個「無效日期」。
有許多方法可以讓你與儲存在日期中的時間戳互動:
日期在內部表示為一個單一的數字,即時間戳。與其互動時,時間戳需要被解釋為一個結構化的日期和時間表示。總有兩種方式來解釋時間戳:作為本地時間或作為世界協調時間(UTC),這是由世界時間標準定義的全球標準時間。本地時區並未儲存在日期物件中,而是由主機環境(使用者的裝置)決定。
備註:UTC 不應與格林威治標準時間(GMT)混淆,因為它們不總是相等的——這在連結的維基百科頁面中有更詳細的解釋。
例如,時間戳 0 代表歷史上的一個獨特瞬間,但它可以被解釋為兩種方式:
getTimezoneOffset() 方法回傳 UTC 與本地時間之間的差異(以分鐘為單位)。請注意,時區偏移不僅取決於當前的時區,還取決於 Date 物件所代表的時間,因為有日光節約時間和歷史變更。本質上,時區偏移是在 Date 物件所代表的時間和主機環境所在位置上,相對於 UTC 時間的偏移。
Date 方法有兩組:一組透過將時間戳解釋為本地時間來獲取和設定各種日期元件,而另一組則使用 UTC。
Date() 建構子可以帶有兩個或更多引數被呼叫,在這種情況下,它們會分別被解釋為本地時間的年、月、日、時、分、秒和毫秒。Date.UTC() 的工作方式類似,但它將元件解釋為 UTC 時間,並且也接受一個代表年份的單一引數。
備註:某些方法,包括 Date() 建構子、Date.UTC() 以及已棄用的 getYear()/setYear() 方法,會將兩位數的年份解釋為 1900 年代的年份。例如,new Date(99, 5, 24) 被解釋為 1999 年 6 月 24 日,而不是 99 年 6 月 24 日。更多資訊請參見兩位數年份的解釋。
當一個區段溢位或下溢其預期範圍時,它通常會「進位到」或「從」更高的區段「借位」。例如,如果月份設定為 12(月份是從零開始的,所以 12 月是 11),它會變成下一年的 1 月。如果月份中的日期設定為 0,它會變成前一個月的最後一天。這也適用於使用日期時間字串格式指定的日期。
當試圖將本地時間設定為落在偏移轉換期間(通常是日光節約時間)的時間時,確切的時間是使用與 Temporal 的 disambiguation: "compatible" 選項相同的行為來推導的。也就是說,如果本地時間對應到兩個瞬間,則選擇較早的一個;如果本地時間不存在(存在一個間隙),我們則向前推進間隙的持續時間。
將日期格式化為字串的方法有很多種。JavaScript 規範只指定了一種普遍支援的格式:日期時間字串格式,這是 ISO 8601 日曆日期擴展格式的簡化版。格式如下:
YYYY-MM-DDTHH:mm:ss.sssZ可以省略各種元件,因此以下都是有效的:
例如,"2011-10-10"(僅日期格式)、"2011-10-10T14:48:00"(日期時間格式)或 "2011-10-10T14:48:00.000+09:00"(帶有毫秒和時區的日期時間格式)都是有效的日期時間字串。
當缺少時區偏移時,僅日期格式被解釋為 UTC 時間,而日期時間格式被解釋為本地時間。解釋為 UTC 時間是由於一個歷史性的規範錯誤,該錯誤與 ISO 8601 不一致,但由於 web 相容性而無法更改。請參見解析器損壞——一個現實 Web 問題。
Date.parse() 和 Date() 建構子都接受日期時間字串格式的字串作為輸入。此外,當輸入不符合此格式時,實作允許支援其他日期格式。
toISOString() 方法以日期時間字串格式回傳日期的字串表示,時區偏移總是設定為 Z(UTC)。
備註:為了最大程度的相容性,我們鼓勵你確保你的輸入符合上述的日期時間字串格式,因為不保證支援其他格式。然而,有些格式在所有主要實作中都受到支援——例如 RFC 2822 格式——在這種情況下,使用它們是可以接受的。務必進行跨瀏覽器測試以確保你的程式碼在所有目標瀏覽器中都能運作。如果需要適應多種不同格式,函式庫會有所幫助。
非標準字串可以由實作以任何期望的方式進行解析,包括時區——大多數實作預設使用本地時區。實作不需要對超出範圍的日期元件回傳無效日期,儘管它們通常會這樣做。一個字串可能具有在範圍內的日期元件(如上定義的範圍),但實際上並不代表一個日期(例如,「February 30」)。在這種情況下,實作的行為不一致。Date.parse() 頁面提供了更多關於這些非標準案例的範例。
範例請參見 toString 方法回傳值的格式一節。
當作為建構子呼叫時,回傳一個新的 Date 物件。當作為函式呼叫時,回傳一個表示當前日期和時間的字串。
回傳對應於當前時間的數值——自 1970 年 1 月 1 日 00:00:00 UTC 以來的毫秒數,忽略閏秒。
Date.parse()解析一個日期的字串表示,並回傳自 1970 年 1 月 1 日 00:00:00 UTC 以來的毫秒數,忽略閏秒。
Date.UTC()接受與建構子最長形式(即 2 到 7 個)相同的參數,並回傳自 1970 年 1 月 1 日 00:00:00 UTC 以來的毫秒數,忽略閏秒。
這些屬性定義在 Date.prototype 上,並由所有 Date 實例共享。
Date.prototype.constructor建立實例物件的建構子函式。對於 Date 實例,初始值是 Date 建構子。
根據本地時間,回傳指定日期的月份中的日期(1 – 31)。
Date.prototype.getDay()根據本地時間,回傳指定日期的星期(0 – 6)。
Date.prototype.getFullYear()根據本地時間,回傳指定日期的年份(4 位數年份則為 4 位數)。
Date.prototype.getHours()根據本地時間,回傳指定日期中的小時(0 – 23)。
Date.prototype.getMilliseconds()根據本地時間,回傳指定日期中的毫秒(0 – 999)。
Date.prototype.getMinutes()根據本地時間,回傳指定日期中的分鐘(0 – 59)。
Date.prototype.getMonth()根據本地時間,回傳指定日期中的月份(0 – 11)。
Date.prototype.getSeconds()根據本地時間,回傳指定日期中的秒數(0 – 59)。
Date.prototype.getTime()回傳指定日期的數值,即自 1970 年 1 月 1 日 00:00:00 UTC 以來的毫秒數。(對於之前的時間,回傳負值。)
Date.prototype.getTimezoneOffset()回傳當前地區的時區偏移(以分鐘為單位)。
Date.prototype.getUTCDate()根據世界協調時間,回傳指定日期的月份中的日期(1 – 31)。
Date.prototype.getUTCDay()根據世界協調時間,回傳指定日期的星期(0 – 6)。
Date.prototype.getUTCFullYear()根據世界協調時間,回傳指定日期的年份(4 位數年份則為 4 位數)。
Date.prototype.getUTCHours()根據世界協調時間,回傳指定日期中的小時(0 – 23)。
Date.prototype.getUTCMilliseconds()根據世界協調時間,回傳指定日期中的毫秒(0 – 999)。
Date.prototype.getUTCMinutes()根據世界協調時間,回傳指定日期中的分鐘(0 – 59)。
Date.prototype.getUTCMonth()根據世界協調時間,回傳指定日期中的月份(0 – 11)。
Date.prototype.getUTCSeconds()根據世界協調時間,回傳指定日期中的秒數(0 – 59)。
Date.prototype.getYear()根據本地時間,回傳指定日期的年份(通常為 2-3 位數)。請改用 getFullYear()。
Date.prototype.setDate()根據本地時間,設定指定日期的月份中的日期。
Date.prototype.setFullYear()根據本地時間,設定指定日期的完整年份(例如,4 位數年份則為 4 位數)。
Date.prototype.setHours()根據本地時間,設定指定日期的小時。
Date.prototype.setMilliseconds()根據本地時間,設定指定日期的毫秒。
Date.prototype.setMinutes()根據本地時間,設定指定日期的分鐘。
Date.prototype.setMonth()根據本地時間,設定指定日期的月份。
Date.prototype.setSeconds()根據本地時間,設定指定日期的秒數。
Date.prototype.setTime()將 Date 物件設定為自 1970 年 1 月 1 日 00:00:00 UTC 以來的毫秒數所代表的時間。對於之前的時間,請使用負數。
Date.prototype.setUTCDate()根據世界協調時間,設定指定日期的月份中的日期。
Date.prototype.setUTCFullYear()根據世界協調時間,設定指定日期的完整年份(例如,4 位數年份則為 4 位數)。
Date.prototype.setUTCHours()根據世界協調時間,設定指定日期的小時。
Date.prototype.setUTCMilliseconds()根據世界協調時間,設定指定日期的毫秒。
Date.prototype.setUTCMinutes()根據世界協調時間,設定指定日期的分鐘。
Date.prototype.setUTCMonth()根據世界協調時間,設定指定日期的月份。
Date.prototype.setUTCSeconds()根據世界協調時間,設定指定日期的秒數。
Date.prototype.setYear()根據本地時間,設定指定日期的年份(通常為 2-3 位數)。請改用 setFullYear()。
Date.prototype.toDateString()以人類可讀的字串(如 'Thu Apr 12 2018')回傳 Date 的「日期」部分。
Date.prototype.toISOString()將日期轉換為遵循 ISO 8601 擴展格式的字串。
Date.prototype.toJSON()使用 toISOString() 回傳表示 Date 的字串。旨在由 JSON.stringify() 隱式呼叫。
Date.prototype.toLocaleDateString()根據系統設定,回傳一個帶有此日期之日期部分的地區敏感表示的字串。
Date.prototype.toLocaleString()回傳一個帶有此日期之地區敏感表示的字串。覆寫 Object.prototype.toLocaleString() 方法。
Date.prototype.toLocaleTimeString()根據系統設定,回傳一個帶有此日期之時間部分的地區敏感表示的字串。
Date.prototype.toString()回傳表示指定 Date 物件的字串。覆寫 Object.prototype.toString() 方法。
Date.prototype.toTemporalInstant()回傳一個新的 Temporal.Instant 物件,其 epochMilliseconds 值與此日期的時間戳相同。
Date.prototype.toTimeString()以人類可讀的字串回傳 Date 的「時間」部分。
Date.prototype.toUTCString()使用 UTC 時區將日期轉換為字串。
Date.prototype.valueOf()回傳 Date 物件的原始值。覆寫 Object.prototype.valueOf() 方法。
Date.prototype[Symbol.toPrimitive]()將此 Date 物件轉換為原始值。
以下範例展示了建立 JavaScript 日期的幾種方法:
備註:從字串建立日期有許多行為不一致之處。關於使用不同格式的注意事項,請參見日期時間字串格式。
new Date() 對於兩位數的年份值表現出遺留的、不理想且不一致的行為;具體來說,當 new Date() 呼叫被給予一個兩位數的年份值時,該年份值不會被視為字面上的年份並直接使用,而是被解釋為一個相對偏移量——在某些情況下是相對於 1900 年的偏移,但在其他情況下則是相對於 2000 年的偏移。
因此,要建立和獲取 0 到 99 年之間的日期,應改用首選的 setFullYear() 和 getFullYear() 方法:
以下範例展示了如何確定兩個 JavaScript 日期之間經過的時間(以毫秒為單位)。由於天(因日光節約時間轉換)、月和年的長度不同,以大於時、分、秒的單位表示經過的時間需要解決許多問題,在嘗試之前應進行徹底的研究。
備註:在支援 Performance API 高解析度時間功能的瀏覽器中,Performance.now() 可以提供比 Date.now() 更可靠和精確的經過時間測量。
在這種情況下,只回傳一個整數是很重要的——所以簡單的除法是不行的。只回傳實際經過的秒數也很重要。(這就是為什麼這段程式碼使用 Math.floor(),而不是 Math.round()。)
| ECMAScript® 2027 Language Specification # sec-date-objects |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年9月3日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.