JavaScript 的Date 對象常常令人困惑,以至於我們一需要處理日期和時間就求助於庫(如Date-fns 和Moment)。
但我們並不總是需要庫。如果您知道需要注意什麼,Date 實際上可以非常簡單。在本文中,我將引導您了解Date 對象的所有知識。
首先,讓我們承認時區的存在。
時區
世界上有數百個時區。在JavaScript 中,我們只關心兩個——本地時間和協調世界時(UTC)。
- 本地時間指的是您計算機所在的時區。
- UTC在實踐中與格林威治標準時間(GMT) 同義。
默認情況下,JavaScript 中幾乎所有日期方法(除一種外)都提供本地時間的日期/時間。只有在指定UTC 時,您才能獲得UTC。
有了這些,我們可以討論創建日期。
創建日期
您可以使用new Date()
創建日期。使用new Date()
有四種可能的方法:
- 使用日期字符串
- 使用日期參數
- 使用時間戳
- 不帶參數
日期字符串方法
在日期字符串方法中,您可以通過將日期字符串傳遞到new Date
來創建日期。
new Date('1988-03-21')
我們在編寫日期時傾向於使用日期字符串方法。這是很自然的,因為我們一生都在使用日期字符串。
如果我寫21-03-1988,您不會有任何問題推斷出它是1988 年3 月21 日。對吧?但是如果您在JavaScript 中寫21-03-1988,則會得到Invalid Date
。
這有一個很好的理由。
我們在世界不同地區對日期字符串的解釋不同。例如,11-06-2019 可能是2019 年6 月11 日或2019 年11 月6 日。但您無法確定我指的是哪一個,除非您知道我使用的日期系統。
在JavaScript 中,如果您想使用日期字符串,則需要使用全世界都接受的格式。這些格式之一是ISO 8601 擴展格式。
<code>// ISO 8601 扩展格式`YYYY-MM-DDTHH:mm:ss.sssZ`</code>
以下是值的含義:
- YYYY:4 位數年份
- MM:2 位數月份(1 月為01,12 月為12)
- DD:2 位數日期(0 到31)
- -:日期分隔符
- T:指示時間的開始
- HH:24 位數小時(0 到23)
- mm:分鐘(0 到59)
- ss:秒(0 到59)
- sss:毫秒(0 到999)
- :: 時間分隔符
- Z:如果存在Z,則日期將設置為UTC。如果不存在Z,則為本地時間。 (這僅適用於提供時間的情況。)
如果您要創建日期,則小時、分鐘、秒和毫秒是可選的。因此,如果您想為2019 年6 月11 日創建日期,您可以這樣寫:
new Date('2019-06-11')
請特別注意此處。使用日期字符串創建日期存在一個很大的問題。如果您將此日期console.log
,則可以發現問題。
如果您居住在落後於GMT 的地區,您將獲得顯示為6 月10 日的日期。
如果您居住在領先於GMT 的地區,您將獲得顯示為6 月11 日的日期。
發生這種情況是因為日期字符串方法具有特殊行為:如果您創建日期(不指定時間),則會獲得設置為UTC 的日期。
在上述情況下,當您編寫new Date('2019-06-11')
時,您實際上創建的日期是2019 年6 月11 日,UTC 凌晨12 點。這就是為什麼居住在落後於GMT 的地區的人們會得到6 月10 日而不是6 月11 日的原因。
如果您想使用日期字符串方法在本地時間創建日期,則需要包含時間。包含時間時,您至少需要編寫HH 和mm(否則Google Chrome 會返回無效日期)。
new Date('2019-06-11T00:00')
使用日期字符串的整個本地時間與UTC 問題可能是難以捕捉的錯誤來源。因此,我建議您不要使用日期字符串創建日期。
(順便說一句,MDN 警告不要使用日期字符串方法,因為瀏覽器可能會以不同的方式解析日期字符串)。
如果您想創建日期,請使用參數或時間戳。
使用參數創建日期
您可以傳入最多七個參數來創建日期/時間。
- 年份: 4 位數年份。
- 月份:月份(0-11)。月份是從零開始的。如果省略,則默認為0。
- 日期:月份中的日期(1-31)。如果省略,則默認為1。
- 小時:一天中的小時(0-23)。如果省略,則默認為0。
- 分鐘:分鐘(0-59)。如果省略,則默認為0。
- 秒:秒(0-59)。如果省略,則默認為0。
- 毫秒:毫秒(0-999)。如果省略,則默認為0。
// 2019 年6 月11 日,上午5:23:59,本地時間new Date(2019, 5, 11, 5, 23, 59)
許多開發人員(包括我自己)避免使用參數方法,因為它看起來很複雜。但實際上它很簡單。
嘗試從左到右讀取數字。從左到右,您以遞減的幅度插入值:年、月、日、小時、分鐘、秒和毫秒。
new Date(2017, 3, 22, 5, 23, 50) // 如果您遵循從左到右的公式,則可以輕鬆讀取此日期。 // 年份:2017, // 月份:四月(因為月份是從零開始的) // 日期:22 // 小時:05 // 分鐘:23 // 秒:50
Date 最成問題的部分是月份值是從零開始的,即1 月=== 0,2 月=== 1,3 月=== 2,依此類推。
JavaScript 是從零開始的有點奇怪(顯然是因為Java 就是這樣做的),但與其爭論為什麼1 月應該是1(而不是0),不如接受JavaScript 中月份是從零開始的。一旦您接受了這個事實,日期就變得更容易處理了。
以下是一些供您熟悉的更多示例:
// 1988 年3 月21 日,凌晨12 點,本地時間。 new Date(1988, 2, 21) // 2019 年12 月25 日,上午8 點,本地時間。 new Date(2019, 11, 25, 8) // 2023 年11 月6 日,凌晨2:20,本地時間new Date(2023, 10, 6, 2, 20) // 2019 年6 月11 日,上午5:23:59,本地時間new Date(2019, 5, 11, 5, 23, 59)
注意使用參數創建的日期都是本地時間?
這是使用參數的額外好處之一——您不會混淆本地時間和UTC。如果您需要UTC,您可以通過這種方式在UTC 中創建日期:
// 2019 年6 月11 日,凌晨12 點,UTC。 new Date(Date.UTC(2019, 5, 11))
使用時間戳創建日期
在JavaScript 中,時間戳是從1970 年1 月1 日起經過的毫秒數(1970 年1 月1 日也稱為Unix 紀元時間)。根據我的經驗,您很少使用時間戳來創建日期。您只使用時間戳來比較不同的日期(稍後將詳細介紹)。
// 2019 年6 月11 日,上午8 點(在我的本地時間,新加坡) new Date(1560211200000)
不帶參數
如果您不帶任何參數創建日期,則會獲得設置為當前時間(本地時間)的日期。
new Date()
您可以從圖像中看出,當我撰寫本文時,新加坡時間是2019 年5 月25 日上午11:10。
創建日期的總結
- 您可以使用
new Date()
創建日期。 - 有四種可能的語法:
- 使用日期字符串
- 使用參數
- 使用時間戳
- 不帶參數
- 絕不要使用日期字符串方法創建日期。
- 最好使用參數方法創建日期。
- 請記住(並接受)JavaScript 中月份是從零開始的。
接下來,讓我們談談將日期轉換為可讀字符串。
格式化日期
大多數編程語言都提供格式化工具來創建任何您想要的日期格式。例如,在PHP 中,您可以將date("d MY")
寫成類似23 Jan 2019 的日期。
但在JavaScript 中沒有簡單的方法來格式化日期。
本機Date 對象帶有七種格式化方法。這七種方法中的每一種都為您提供一個特定值(而且它們非常無用)。
const date = new Date(2019, 0, 23, 17, 23, 42)
-
toString
為您提供Wed Jan 23 2019 17:23:42 GMT 0800 (Singapore Standard Time) -
toDateString
為您提供Wed Jan 23 2019 -
toLocaleString
為您提供23/01/2019, 17:23:42 -
toLocaleDateString
為您提供23/01/2019 -
toGMTString
為您提供Wed, 23 Jan 2019 09:23:42 GMT -
toUTCString
為您提供Wed, 23 Jan 2019 09:23:42 GMT -
toISOString
為您提供2019-01-23T09:23:42.079Z
如果您需要自定義格式,則需要自己創建。
編寫自定義日期格式
假設您想要類似Thu, 23 January 2019 的內容。要創建此值,您需要了解(並使用)Date 對象附帶的日期方法。
要獲取日期,您可以使用這四種方法:
-
getFullYear
:根據本地時間獲取4 位數年份 -
getMonth
:根據本地時間獲取月份(0-11)。月份是從零開始的。 -
getDate
:根據本地時間獲取月份中的日期(1-31)。 -
getDay
:根據本地時間獲取星期幾(0-6)。星期幾從星期日(0)開始,到星期六(6)結束。
為Thu, 23 January 2019 創建23 和2019 很簡單。我們可以使用getFullYear
和getDate
來獲取它們。
const d = new Date(2019, 0, 23) const year = d.getFullYear() // 2019 const date = d.getDate() // 23
獲取Thu 和January 比較困難。
要獲取January,您需要創建一個對象,將所有十二個月的值映射到它們各自的名稱。
const months = { 0: 'January', 1: 'February', 2: 'March', 3: 'April', 4: 'May', 5: 'June', 6: 'July', 7: 'August', 8: 'September', 9: 'October', 10: 'November', 11: 'December' }
由於月份是從零開始的,我們可以使用數組而不是對象。它會產生相同的結果。
const months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]
要獲取January,您需要:
- 使用
getMonth
從日期中獲取從零開始的月份。 - 從
months
中獲取月份名稱
const monthIndex = d.getMonth() const monthName = months[monthIndex] console.log(monthName) // January
簡寫版本:
const monthName = months[d.getMonth()] console.log(monthName) // January
您對Thu 也執行相同的操作。這次,您需要一個包含一周七天的數組。
const days = [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]
然後你:
- 使用
getDay
獲取dayIndex
- 使用
dayIndex
獲取dayName
const dayIndex = d.getDay() const dayName = days[dayIndex] // Thu
簡寫版本:
const dayName = days[d.getDay()] // Thu
然後,您將創建的所有變量組合起來以獲取格式化的字符串。
const formatted = `${dayName}, ${date} ${monthName} ${year}` console.log(formatted) // Thu, 23 January 2019
是的,這很繁瑣。但是一旦掌握了竅門,它就不可能了。
如果您需要創建自定義格式的時間,可以使用以下方法:
-
getHours
:根據本地時間獲取小時(0-23)。 -
getMinutes
:根據本地時間獲取分鐘(0-59)。 -
getSeconds
:根據本地時間獲取秒(0-59)。 -
getMilliseconds
:根據本地時間獲取毫秒(0-999)。
接下來,讓我們談談比較日期。
比較日期
如果您想知道一個日期是否早於或晚於另一個日期,您可以直接使用>、= 和
const earlier = new Date(2019, 0, 26) const later = new Date(2019, 0, 27) console.log(earlier <p>如果您想檢查兩個日期是否恰好落在同一時間,則比較起來更困難。您不能使用== 或=== 比較它們。</p><pre class="brush:php;toolbar:false"> const a = new Date(2019, 0, 26) const b = new Date(2019, 0, 26) console.log(a == b) // false console.log(a === b) // false
要檢查兩個日期是否恰好落在同一時間,您可以使用getTime
檢查它們的時間戳。
const isSameTime = (a, b) => { return a.getTime() === b.getTime() } const a = new Date(2019, 0, 26) const b = new Date(2019, 0, 26) console.log(isSameTime(a, b)) // true
如果您想檢查兩個日期是否在同一天,您可以檢查它們的getFullYear
、 getMonth
和getDate
值。
const isSameDay = (a, b) => { return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate() } const a = new Date(2019, 0, 26, 10) // 2019 年1 月26 日,上午10 點const b = new Date(2019, 0, 26, 12) // 2019 年1 月26 日,中午12 點console.log(isSameDay(a, b)) // true
還有一件事我們必須介紹。
從另一個日期獲取日期
有兩種可能的情況,您需要從另一個日期獲取日期。
- 從另一個日期設置特定的日期/時間值。
- 從另一個日期添加/減去增量。
設置特定的日期/時間
您可以使用這些方法從另一個日期設置日期/時間:
-
setFullYear
:在本地時間設置4 位數年份。 -
setMonth
:在本地時間設置月份。 -
setDate
:在本地時間設置月份中的日期。 -
setHours
:在本地時間設置小時。 -
setMinutes
:在本地時間設置分鐘。 -
setSeconds
:在本地時間設置秒。 -
setMilliseconds
:在本地時間設置毫秒。
例如,如果您想將日期設置為該月的第15 天,可以使用setDate(15)
。
const d = new Date(2019, 0, 10) d.setDate(15) console.log(d) // 2019 年1 月15 日
如果您想將月份設置為6 月,可以使用setMonth
。 (記住,JavaScript 中的月份是從零開始的!)
const d = new Date(2019, 0, 10) d.setMonth(5) console.log(d) // 2019 年6 月10 日
注意:上述設置方法會更改原始日期對象。在實踐中,我們不應更改對象(此處詳細說明原因)。我們應該在新的日期對像上執行這些操作。
const d = new Date(2019, 0, 10) const newDate = new Date(d) newDate.setMonth(5) console.log(d) // 2019 年1 月10 日console.log(newDate) // 2019 年6 月10 日
從另一個日期添加/減去增量
增量是變化。從另一個日期添加/減去增量是指:您想從另一個日期獲取一個距離為X的日期。它可以是X年、 X月、 X天等。
要獲取增量,您需要知道當前日期的值。您可以使用以下方法獲取它:
-
getFullYear
:根據本地時間獲取4 位數年份 -
getMonth
:根據本地時間獲取月份(0-11)。 -
getDate
:根據本地時間獲取月份中的日期(1-31)。 -
getHours
:根據本地時間獲取小時(0-23)。 -
getMinutes
:根據本地時間獲取分鐘(0-59)。 -
getSeconds
:根據本地時間獲取秒(0-59)。 -
getMilliseconds
:根據本地時間獲取毫秒(0-999)。
添加/減去增量有兩種常用方法。第一種方法在Stack Overflow 上更流行。它簡潔明了,但難以理解。第二種方法比較冗長,但更容易理解。
讓我們介紹這兩種方法。
假設您想從今天開始獲取三天后的日期。在此示例中,我們還假設今天是2019 年3 月28 日。 (當我們使用固定日期時,更容易解釋)。
第一種方法(設置方法)
// 假設今天是2019 年3 月28 日const today = new Date(2019, 2, 28)
首先,我們創建一個新的Date 對象(這樣我們就不會更改原始日期)
const finalDate = new Date(today)
接下來,我們需要知道我們要更改的值。由於我們正在更改日期,我們可以使用getDate
獲取日期。
const currentDate = today.getDate()
我們想要一個比今天晚三天的日期。我們將使用將增量(3) 添加到當前日期。
finalDate.setDate(currentDate 3)
設置方法的完整代碼:
const today = new Date(2019, 2, 28) const finalDate = new Date(today) finalDate.setDate(today.getDate() 3) console.log(finalDate) // 2019 年3 月31 日
第二種方法(新的Date 方法)
在這裡,我們使用getFullYear
、 getMonth
、 getDate
和其他getter 方法,直到我們找到要更改的值的類型。然後,我們使用new Date
創建最終日期。
const today = new Date(2019, 2, 28) // 獲取所需的值const year = today.getFullYear() const month = today.getMonth() const day = today.getDate() // 創建一個新的Date(帶有增量) const finalDate = new Date(year, month, day 3) console.log(finalDate) // 2019 年3 月31 日
這兩種方法都有效。選擇一種並堅持使用它。
自動日期校正
如果您為Date 提供超出其可接受範圍的值,JavaScript 會自動為您重新計算日期。
以下是一個示例。假設我們將日期設置為2019 年3 月33 日。 (日曆上沒有3 月33 日)。在這種情況下,JavaScript 會自動將3 月33 日調整為4 月2 日。
// 3 月33 日=> 4 月2 日new Date(2019, 2, 33)
這意味著在創建增量時,您無需擔心計算分鐘、小時、日期、月份等。 JavaScript 會自動為您處理。
// 3 月33 日=> 4 月2 日new Date(2019, 2, 30 3)
這就是您需要了解的關於JavaScript 本機Date 對象的所有內容。
關於JavaScript 中Date 的更多信息
- 了解JavaScript 中的日期和時間(DigitalOcean)
- 探索JavaScript Date 對象(Alligator.io)
有興趣學習更多JavaScript 嗎?
如果您覺得此Date 簡介有用,您可能會喜歡Learn JavaScript,這是我創建的一個課程,旨在教人們他們需要了解的關於JavaScript 的所有知識。
在本課程中,我將介紹您需要了解的基本概念,然後向您展示如何使用您學到的概念來構建現實世界的組件。
看看。您可能會發現它很有用。
同時,如果您有任何JavaScript 問題,請隨時與我聯繫。我會盡力創建免費文章來回答您的問題。
以上是您需要了解的有關JavaScript日期的所有信息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

具有CSS的自定義光標很棒,但是我們可以將JavaScript提升到一個新的水平。使用JavaScript,我們可以在光標狀態之間過渡,將動態文本放置在光標中,應用複雜的動畫並應用過濾器。

互動CSS動畫和元素相互啟動的元素在2025年似乎更合理。雖然不需要在CSS中實施乒乓球,但CSS的靈活性和力量的增加,可以懷疑Lee&Aver Lee有一天會成為一種

有關利用CSS背景濾波器屬性來樣式用戶界面的提示和技巧。您將學習如何在多個元素之間進行背景過濾器,並將它們與其他CSS圖形效果集成在一起以創建精心設計的設計。

好吧,事實證明,SVG的內置動畫功能從未按計劃進行棄用。當然,CSS和JavaScript具有承載負載的能力,但是很高興知道Smil並沒有像以前那樣死在水中

是的,讓#039;跳上文字包裝:Safari Technology Preview In Pretty Landing!但是請注意,它與在鉻瀏覽器中的工作方式不同。

此CSS-tricks更新了,重點介紹了年鑑,最近的播客出現,新的CSS計數器指南以及增加了幾位新作者,這些新作者貢獻了有價值的內容。

在大多數情況下,人們展示了@Apply的@Apply功能,其中包括Tailwind的單個property實用程序之一(會改變單個CSS聲明)。當以這種方式展示時,@Apply聽起來似乎很有希望。如此明顯


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1
強大的PHP整合開發環境