在 JavaScript (Node.js) 中处理日期和时间:从基础到高级技术
处理日期和时间是 Web 开发中最常见的任务之一。无论是事件日志记录、用户数据处理、任务调度还是时间戳显示,都离不开在 JavaScript 中管理日期的能力。在本文中,我们将探讨在 Node.js 环境中处理日期的所有关键方面:从创建和格式化到时区的复杂操作以及流行库的使用。
基础:JavaScript 中的 Date 对象
内置的 Date 对象是处理日期的基础。它存储自 1970 年 1 月 1 日(Unix 纪元)以来经过的毫秒数。
创建日期
有几种方法可以创建 Date 实例:
// 当前日期和时间const now = new Date();console.log(now); // 2025-03-15T10:30:00.000Z
// 从毫秒数创建(Unix 时间戳)const fromTimestamp = new Date(1742025000000);console.log(fromTimestamp); // 2025-03-15T10:30:00.000Z
// 从字符串创建(ISO 8601)const fromString = new Date('2025-03-15T10:30:00');console.log(fromString);
// 从组件创建(年、月、日、时、分、秒、毫秒)const fromComponents = new Date(2025, 2, 15, 10, 30, 0, 0); // 月份:0-11console.log(fromComponents); // March 15, 2025 10:30:00重要提示:JavaScript 中的月份从 0 开始编号(一月为 0,十二月为 11)。
获取日期组件
用于提取日期各个部分的方法:
const date = new Date('2025-03-15T10:30:45.123Z');
console.log(date.getFullYear()); // 2025console.log(date.getMonth()); // 2(三月)console.log(date.getDate()); // 15console.log(date.getDay()); // 6(星期六,0 为星期日)console.log(date.getHours()); // 10console.log(date.getMinutes()); // 30console.log(date.getSeconds()); // 45console.log(date.getMilliseconds());// 123console.log(date.getTime()); // 自纪元以来的毫秒数在 Node.js 中格式化日期
标准的 Date 对象提供的格式化功能有限。要以可读格式输出,请使用 toLocaleDateString() 和 toLocaleString()。
const date = new Date('2025-03-15T10:30:00');
// 本地化格式化console.log(date.toLocaleDateString('ru-RU')); // 15.03.2025console.log(date.toLocaleTimeString('ru-RU')); // 10:30:00console.log(date.toLocaleString('ru-RU')); // 15.03.2025, 10:30:00
// 带选项const options = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'};console.log(date.toLocaleString('ru-RU', options)); // суббота, 15 марта 2025 г., 10:30自定义格式化
为了完全控制,编写一个简单的函数:
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') { const map = { YYYY: date.getFullYear(), MM: String(date.getMonth() + 1).padStart(2, '0'), DD: String(date.getDate()).padStart(2, '0'), HH: String(date.getHours()).padStart(2, '0'), mm: String(date.getMinutes()).padStart(2, '0'), ss: String(date.getSeconds()).padStart(2, '0'), }; return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => map[match]);}
console.log(formatDate(new Date(), 'DD.MM.YYYY')); // 15.03.2025console.log(formatDate(new Date(), 'HH:mm:ss')); // 10:30:00日期操作:添加、减去、比较
可以通过 set* 方法直接修改日期,或者通过操作毫秒数来修改。
添加和减去时间
const date = new Date('2025-03-15T10:30:00');
// 添加 5 天date.setDate(date.getDate() + 5);console.log(date); // 2025-03-20T10:30:00
// 添加
```