告别日期格式化烦恼:node-dateformat 全方位实战指南
你是否还在为 JavaScript 中日期格式化的繁琐而头疼?手动拼接字符串、处理时区转换、适配不同格式要求,这些重复劳动不仅低效还容易出错。本文将全面解析 node-dateformat 库的核心功能与实战技巧,帮助你在 10 分钟内掌握专业级日期格式化技能,从根本上解决日期处理难题。
读完本文你将获得:
- 20+ 常用日期格式化模板的快速参考
- 本地化多语言日期显示的完整方案
- 时区转换与ISO标准格式的无缝对接
- 性能优化与常见陷阱的避坑指南
- 企业级项目中的最佳实践案例
项目概述:node-dateformat 是什么?
node-dateformat 是基于 Steven Levithan 经典 dateFormat() 函数开发的 Node.js 模块(Node.js Package),它提供了简洁而强大的日期格式化能力。与原生 Date 对象的 toString() 方法相比,该库支持自定义掩码(Mask)、多语言本地化和时区转换,是处理日志记录、报表生成、UI显示等场景的理想选择。
# 安装命令
npm install dateformat
// 基础用法示例
import dateFormat from "dateformat";
console.log(dateFormat(new Date(), "yyyy-mm-dd HH:MM:ss"));
// 输出:2025-09-10 04:20:26
核心功能解析
1. 灵活的掩码系统
node-dateformat 的核心在于其强大的掩码(Mask)系统,通过不同的占位符组合,可以生成任意格式的日期字符串。以下是最常用的掩码分类:
日期相关掩码
| 掩码 | 描述 | 示例 |
|---|---|---|
| d | 月份中的第几天(无前导零) | 9 |
| dd | 月份中的第几天(有前导零) | 09 |
| ddd | 星期缩写 | Sat |
| DDD | 近三天缩写(Ysd/Tdy/Tmw) | Tdy |
| dddd | 星期全称 | Saturday |
| DDDD | 近三天全称(Yesterday/Today/Tomorrow) | Today |
| m | 月份(无前导零) | 9 |
| mm | 月份(有前导零) | 09 |
| mmm | 月份缩写 | Sep |
| mmmm | 月份全称 | September |
| yy | 年份后两位 | 25 |
| yyyy | 完整年份 | 2025 |
时间相关掩码
| 掩码 | 描述 | 示例 |
|---|---|---|
| h | 小时(12小时制,无前导零) | 4 |
| hh | 小时(12小时制,有前导零) | 04 |
| H | 小时(24小时制,无前导零) | 4 |
| HH | 小时(24小时制,有前导零) | 04 |
| M | 分钟(无前导零) | 20 |
| MM | 分钟(有前导零) | 20 |
| s | 秒(无前导零) | 26 |
| ss | 秒(有前导零) | 26 |
| l | 毫秒(三位) | 123 |
| L | 毫秒(两位) | 12 |
| t | 小写时间标记(a/p) | a |
| tt | 小写时间标记(am/pm) | am |
| T | 大写时间标记(A/P) | A |
| TT | 大写时间标记(AM/PM) | AM |
高级掩码
| 掩码 | 描述 | 示例 |
|---|---|---|
| Z | 时区缩写 | UTC |
| o | 时区偏移(±HHMM) | +0000 |
| p | 时区偏移(±HH:MM) | +00:00 |
| S | 日期后缀(st/nd/rd/th) | th |
| W | ISO周数(无前导零) | 37 |
| WW | ISO周数(有前导零) | 37 |
| N | ISO星期几(1-7,周一为1) | 3 |
2. 预定义命名格式
为了简化常见场景,node-dateformat 提供了多种预定义命名格式,可直接通过名称调用:
| 名称 | 掩码 | 示例 |
|---|---|---|
| default | ddd mmm dd yyyy HH:MM:ss | Wed Sep 10 2025 04:20:26 |
| shortDate | m/d/yy | 9/10/25 |
| paddedShortDate | mm/dd/yyyy | 09/10/2025 |
| mediumDate | mmm d, yyyy | Sep 10, 2025 |
| longDate | mmmm d, yyyy | September 10, 2025 |
| fullDate | dddd, mmmm d, yyyy | Wednesday, September 10, 2025 |
| shortTime | h:MM TT | 4:20 AM |
| mediumTime | h:MM:ss TT | 4:20:26 AM |
| longTime | h:MM:ss TT Z | 4:20:26 AM UTC |
| isoDate | yyyy-mm-dd | 2025-09-10 |
| isoTime | HH:MM:ss | 04:20:26 |
| isoDateTime | yyyy-mm-dd'T'HH:MM:sso | 2025-09-10T04:20:26+0000 |
| isoUtcDateTime | UTC:yyyy-mm-dd'T'HH:MM:ss'Z' | 2025-09-10T04:20:26Z |
// 使用预定义格式
import dateFormat from "dateformat";
// 输出ISO格式日期
console.log(dateFormat(new Date(), "isoDate")); // 2025-09-10
// 输出完整日期时间
console.log(dateFormat(new Date(), "fullDate")); // Wednesday, September 10, 2025
3. 自定义掩码
除了使用预定义格式,你还可以创建自己的自定义掩码:
import dateFormat, { masks } from "dateformat";
// 添加自定义掩码
masks.myFormat = "yyyy年MM月dd日 HH时MM分ss秒";
console.log(dateFormat(new Date(), "myFormat")); // 2025年09月10日 04时20分26秒
// 直接使用掩码字符串
console.log(dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss")); // 2025-09-10 04:20:26
4. 时区处理
node-dateformat 提供了多种时区处理方式:
import dateFormat from "dateformat";
const now = new Date();
// 方式1: 使用UTC参数
console.log(dateFormat(now, "yyyy-mm-dd HH:MM:ss", true)); // UTC时间
// 方式2: 掩码前缀
console.log(dateFormat(now, "UTC:yyyy-mm-dd HH:MM:ss")); // UTC时间
console.log(dateFormat(now, "GMT:yyyy-mm-dd HH:MM:ss")); // GMT时间
// 显示时区偏移
console.log(dateFormat(now, "yyyy-mm-dd HH:MM:ss o")); // 2025-09-10 04:20:26 +0000
console.log(dateFormat(now, "yyyy-mm-dd HH:MM:ss p")); // 2025-09-10 04:20:26 +00:00
5. 本地化支持
通过修改 i18n 对象,可以实现日期的多语言显示:
import { i18n } from "dateformat";
// 设置中文本地化
i18n.dayNames = [
"日", "一", "二", "三", "四", "五", "六",
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
];
i18n.monthNames = [
"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二",
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
];
i18n.timeNames = ["上", "下", "上午", "下午", "上", "下", "上午", "下午"];
console.log(dateFormat(new Date(), "dddd, mmmm d, yyyy")); // 星期三, 九月 10, 2025
console.log(dateFormat(new Date(), "h:MM TT")); // 4:20 上午
函数参数详解
dateFormat 函数的完整参数如下:
dateFormat(date, mask, utc, gmt)
| 参数 | 类型 | 描述 | 默认值 |
|---|---|---|---|
| date | Date|String|Number | 要格式化的日期 | 当前日期 |
| mask | String | 格式化掩码或预定义格式名称 | "default" |
| utc | Boolean | 是否使用UTC时间 | false |
| gmt | Boolean | 是否使用GMT时间 | false |
参数使用的几种情况:
import dateFormat from "dateformat";
// 只传日期
console.log(dateFormat(new Date())); // 使用默认掩码
// 只传掩码(获取当前日期)
console.log(dateFormat("isoDate")); // 2025-09-10
// 完整参数
console.log(dateFormat(new Date(), "yyyy-mm-dd", true)); // UTC日期
常见问题与解决方案
1. 日期解析问题
当传入非标准日期字符串时,可能会导致解析错误:
import dateFormat from "dateformat";
// 错误示例
console.log(dateFormat("2025/09/10", "isoDate")); // 可能无法正确解析
// 正确做法:先创建Date对象
const date = new Date("2025/09/10");
if (!isNaN(date.getTime())) { // 检查日期是否有效
console.log(dateFormat(date, "isoDate")); // 2025-09-10
} else {
console.error("无效日期");
}
2. 性能优化
对于大量日期格式化操作,可以考虑预编译掩码或使用更轻量级的方式:
import dateFormat from "dateformat";
// 预定义常用格式
const formatIso = (date) => dateFormat(date, "isoDateTime");
// 批量处理时使用
const dates = [new Date(), new Date(2025, 0, 1), new Date(2025, 11, 31)];
const formatted = dates.map(formatIso);
3. 浏览器环境使用
虽然 node-dateformat 主要是为 Node.js 设计的,但也可以在浏览器中使用:
<!-- 通过CDN引入 -->
<script src="https://cdn.jsdelivr.net/npm/dateformat@5.0.3/lib/dateformat.min.js"></script>
<script>
console.log(dateFormat(new Date(), "yyyy-mm-dd"));
</script>
企业级应用案例
1. 日志系统
import dateFormat from "dateformat";
import fs from "fs";
function log(message, level = "info") {
const timestamp = dateFormat(new Date(), "yyyy-mm-dd HH:MM:ss");
const logLine = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
fs.appendFile("app.log", logLine, (err) => {
if (err) throw err;
});
console.log(logLine.trim());
}
// 使用
log("应用启动成功");
log("数据库连接失败", "error");
2. 报表生成
import dateFormat from "dateformat";
function generateReport(data) {
const report = {
generatedAt: dateFormat(new Date(), "yyyy-mm-dd HH:MM:ss"),
data: data.map(item => ({
...item,
createdAt: dateFormat(new Date(item.createdAt), "yyyy-mm-dd"),
updatedAt: dateFormat(new Date(item.updatedAt), "yyyy-mm-dd HH:MM:ss")
}))
};
return JSON.stringify(report, null, 2);
}
3. API响应格式化
import express from "express";
import dateFormat from "dateformat";
const app = express();
app.get("/users", (req, res) => {
// 假设从数据库获取用户数据
const users = [
{ id: 1, name: "张三", registerDate: new Date(2025, 0, 15) },
{ id: 2, name: "李四", registerDate: new Date(2025, 1, 20) }
];
// 格式化日期后返回
res.json(users.map(user => ({
...user,
registerDate: dateFormat(user.registerDate, "yyyy年MM月dd日")
})));
});
app.listen(3000);
项目扩展与贡献
1. 安装开发环境
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/no/node-dateformat
cd node-dateformat
# 安装依赖
npm install
# 运行测试
npm test
2. 测试结构
项目的测试文件位于 test/ 目录下,按功能模块组织:
test/
├── test_dayofweek.js
├── test_formats.js
├── test_isoutcdatetime.js
├── test_mask-*.js # 各种掩码测试
├── test_quotes.js
├── test_threedays.js
└── weekofyear/
├── test_weekofyear.js
└── test_weekofyear.sh
3. 贡献指南
如果你想为项目做贡献,可以:
- 报告 bug 或提出功能建议
- 提交代码修复或改进
- 完善文档或添加新的测试用例
请先阅读项目的 CONTRIBUTING.md 文件,了解贡献规范。
总结与展望
node-dateformat 作为一个轻量级但功能强大的日期格式化库,通过灵活的掩码系统、丰富的预定义格式和本地化支持,极大地简化了 JavaScript 中的日期处理工作。无论是小型项目还是大型企业应用,它都能满足你的日期格式化需求。
随着 JavaScript 标准的不断发展,未来可能会有更多原生功能支持日期格式化,但 node-dateformat 凭借其稳定性和丰富功能,仍将是一个可靠的选择。建议保持关注项目的更新,及时获取新特性和安全补丁。
掌握 node-dateformat,让日期处理从繁琐的重复劳动中解放出来,让你更专注于核心业务逻辑的实现。现在就尝试将它集成到你的项目中,体验高效日期格式化的魅力吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



