JavaScript 中處理日期格式化
在 JavaScript 中處理日期格式化,原生能力確實(shí)有限,但現(xiàn)代的 Intl 對(duì)象提供了不錯(cuò)的基礎(chǔ)支持。對(duì)于更復(fù)雜或要求高的場景,社區(qū)一些優(yōu)秀的庫能讓你事半功倍。
下面這個(gè)表格整理了主要的日期格式化方案,幫你快速了解:
| 方案類型 | 代表庫/方法 | 核心特點(diǎn) | 適用場景 |
|---|---|---|---|
| 原生 JS 方案 | Intl.DateTimeFormat |
瀏覽器內(nèi)置,支持國際化,無需額外依賴 | 簡單的、對(duì)包體積敏感的需求 |
| 手動(dòng)拼接 | 完全控制輸出格式,代碼靈活 | 極簡單的特定格式,且不愿引入任何工具 | |
| 第三方庫 | Day.js | 輕量(僅 2kB),API 與 Moment.js 相似 | 絕大多數(shù)項(xiàng)目,平衡功能與體積 |
| date-fns | 函數(shù)式、模塊化,按需引入 | 模塊化項(xiàng)目,追求 tree shaking | |
| Moment.js | 功能極其全面,社區(qū)資源豐富 | 遺留項(xiàng)目,或需要處理非常復(fù)雜的日期時(shí)間 |
?? 原生 JavaScript 方案
如果需求簡單,或者你特別在意包大小,原生能力基本夠用。
-
Intl.DateTimeFormat(推薦)
這是目前瀏覽器原生方法里最強(qiáng)大和現(xiàn)代的,尤其擅長處理國際化。const date = new Date(); const formatter = new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false // 使用24小時(shí)制 }); console.log(formatter.format(date)); // 輸出示例: "2023/10/05 15:24:00" -
手動(dòng)拼接
這種方式就是直接獲取日期的各個(gè)部分,然后拼成你想要的字符串。function formatDate(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } console.log(formatDate(new Date())); // 輸出示例: "2023-10-05 15:24:00"缺點(diǎn)也很明顯:代碼相對(duì)繁瑣,處理12小時(shí)制、時(shí)區(qū)、本地化等會(huì)很麻煩。
?? 第三方庫推薦
當(dāng)原生方法無法滿足需求時(shí),下面這些庫是更好的選擇。
-
Day.js:現(xiàn)代輕量之選
- 優(yōu)勢:API 設(shè)計(jì)友好,體積極小,可以通過插件擴(kuò)展功能(如時(shí)區(qū)、相對(duì)時(shí)間等)。
- 示例:
import dayjs from 'dayjs'; console.log(dayjs().format('YYYY-MM-DD')); // 輸出示例:"2025-03-26" console.log(dayjs().format('YYYY-MM-DD HH:mm:ss')); // 輸出示例:"2025-06-05 10:00:00"
-
date-fns:模塊化工具集
- 優(yōu)勢:函數(shù)式編程風(fēng)格,利于 tree shaking,特別適合在模塊化打包的項(xiàng)目中使用,可以只引入你用到的方法。
- 示例:
import { format } from 'date-fns'; console.log(format(new Date(), 'yyyy-MM-dd HH:mm:ss')); // 輸出示例:"2023-06-05 10:00:00"
?? 如何選擇?
- 追求小巧、易上手,應(yīng)對(duì)大部分日常場景:直接選擇 Day.js。
- 項(xiàng)目基于模塊化構(gòu)建,且注重代碼最優(yōu)打包:可以考慮 date-fns。
- 處理簡單日期顯示,且不希望任何外部依賴:使用原生的
Intl.DateTimeFormat。 - 維護(hù)老項(xiàng)目,或需要進(jìn)行極其復(fù)雜的日期操作(如大量歷史時(shí)區(qū)轉(zhuǎn)換):才考慮 Moment.js。

浙公網(wǎng)安備 33010602011771號(hào)