JS 日期與時間重點整理
前情提要:
由於我過去比較少接觸到時間與日期相關的功能需求,對於在 JavaScript 中如何處理時間一直處在一個一知半解的狀態,只是大概知道 JavaScript 有提供了一個內建的Date物件來可以用來輔助操作時間類型的資料,常常是碰到相關需求時,才來找看看有沒有什麼現成的內建函式或套件可以達成我要的功能。因此,我想透過這篇筆記,一次性地整理 JS 中日期與時間的重點知識。
時間的表示方法與標準格式
在開發應用程式時,我們常常會以字串來儲存日期與時間的資料,但由於時間的表示方法有很多種,如果前後端沒有事先溝通好使用一個相同的時間表示格式,就可能會導致錯誤地解析對方傳來的時間資料。比方說,後端習慣以 「2024/01/01」 這樣的格式傳遞時間,但前端卻期待接收「01.01.2024」這種格式的時間。
因此,如果有個放諸四海皆通用的標準時間格式讓所有人去遵守,那麼將可以省下非常多的溝通成本。以下我將介紹在開發 JavaScript 時常見的幾種時間表示標準,包括 ISO 8601 、RFC 2822、UTC 世界標準時間和 Unix 時間戳記。
ISO 8601 格式
國際標準ISO 8601,是國際標準化組織的日期和時間的表示方法,其基本原則如下:
- 時間日期按照年月日時分秒的順序排列,大時間單位在小時間單位之前。
- 每個時間單位的位數固定,不足時於左補0。
- 精度不足時,可以從右側開始忽略日期或時間的某個單位。
EMCAScript 標準中 ISO 8601 標準日期和時間的結構如下:
YYYY-MM-DDTHH:mm:ss.sssZ
- YMD代表年月日,Hms代表是時分秒
T只是分隔年月日與時分秒的符號Z是時區的意思,單純用Z代表是UTC標準時間,如果是其他時區的時間可以用+或-,再加上HH:mm作為時區的表達式。
以下為符合 ISO 8601 標準的日期時間字串:
2024-09-05 // 僅表示日期
14:48:00 // 僅表示時間
2024-09-05T14:48 // 時間的部份至少要有時與分
2024-09-05T14:48:00.000Z
2024-09-05T14:48:00.000+08:00
RFC 2822 格式
RFC 2822 格式最常見於電子郵件系統中,它是一種簡單的文字格式,並且與我們日常生活中看到的時間格式比較相似。它主要用於將時間表示成一個對人類更加友善的方式,不過它的精確度相比 ISO 8601 略遜一籌。
RFC 2822 的日期時間表示方式相對靈活,可以接受多種不同的格式。常見的完整格式如下:
ddd, DD MMM YYYY HH:mm:ss ±HHmm
ddd:表示星期的縮寫(例如:Mon、Tue)DD:日期,固定為兩位數,位數不足時左側補 0MMM:月份的英文縮寫(例如:Jan、Feb)YYYY:四位數的年份HH:mm:ss:時間,使用 24 小時制±HHmm:時區偏移量,表示相對於 UTC 的時差(例如:+0800表示東八區,0500表示美國東部時間)
除此之外,RFC 2822 也接受其他變體格式,例如:
MMM DD, YYYYDD MMM, YYYY
以下是幾個符合 RFC 2822 標準的日期和時間格式範例:
Mon, 05 Sep 2024 14:48:00 +0800 // 表示東八區時間
Tue, 06 Sep 2024 03:00:00 -0500 // 表示美國東部時區
Jan 1, 2024 // 僅顯示月份和日期
1 Jan, 2024 // 日期和月份的另一種變體
UTC 世界標準時間
世界協調時間 UTC(Coordinated Universal Time)是目前世界上使用最為廣泛的時間標準。與 GMT(格林威治標準時間)相似,UTC 不會受地理位置或時間調整(例如夏令時間)的影響,是一個穩定、統一的時間基準。
JavaScript 的 Date 物件內部就是使用 UTC 來儲存和處理時間,以確保跨時區的時間一致性。,而 Date 提供了一系列與 UTC 相關的函式來取得或設定時間,例如 getUTCFullYear()、getUTCHours()、toUTCString() 等。
UTC 的時間格式範例如下:
Thu, 05 Sep 2024 14:48:00 GMT
Unix 時間戳記
Unix 時間戳記是另一種常見的時間表示方式,它表示自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數(或毫秒數)。這種表示方式非常常見於後端資料庫和系統層級的應用中,因為它能提供一個簡單且不依賴時區的標準化時間格式。使用這種格式可以很方便地進行時間的運算,例如計算兩個時間點之間的差異,或是進行時間排序。
在 JavaScript 中,Date.now() 會返回當前時間的毫秒級 Unix 時間戳
let timestamp = Date.now(); // 返回當前時間的毫秒數
console.log(timestamp); // 輸出類似 1693937280000 的值