在 JavaScript (Node.js) 中处理日期和时间:从基础到进阶技术
处理日期和时间是后端开发中最常见的任务之一。无论是事件日志记录、期限计算、报告生成还是 API 交互,正确掌握时间戳处理都是一项至关重要的技能。在本文中,我们将全面解析在 Node.js 环境中处理日期的所有关键方面:从内置的 Date 对象到能够简化开发者工作的流行库。
1. 内置 Date 对象:基础与陷阱
在 JavaScript 中,处理日期由内置的 Date 对象负责。它提供了创建、读取和操作日期的基础方法。然而,它有一些需要了解的重要特性。
创建 Date 对象
获取当前日期和时间的最简单方法:
const now = new Date();console.log(now); // 2025-03-20T14:30:00.000Z (示例)可以通过字符串、timestamp(自 1970 年 1 月 1 日以来的毫秒数)或手动指定组件来创建日期:
// 从字符串 (ISO 8601)const dateFromString = new Date("2025-12-25T10:00:00Z");
// 从 timestampconst dateFromTimestamp = new Date(1735048800000);
// 从组件 (年, 月 (0-11), 日, 时, 分, 秒, 毫秒)const dateFromParts = new Date(2025, 11, 25, 10, 0, 0, 0); // 2025年12月25日 10:00:00console.log(dateFromParts); // 2025-12-25T07:00:00.000Z (取决于时区)重要提示: JavaScript 中的月份从 0 开始编号(一月为 0,十二月为 11)。这是常见的错误原因。
获取日期组件
Date 对象提供了获取各个组件的方法:
const date = new Date();console.log(date.getFullYear()); // 2025console.log(date.getMonth()); // 2 (三月,因为从0开始计数)console.log(date.getDate()); // 20console.log(date.getDay()); // 4 (星期四,0 为星期日)console.log(date.getHours()); // 17console.log(date.getMinutes()); // 45console.log(date.getSeconds()); // 12console.log(date.getMilliseconds());// 345console.log(date.getTime()); // 1742474712345 (timestamp)请注意:所有这些方法返回的值都基于服务器的本地时区。要使用 UTC,请使用带有 getUTC... 前缀的方法(例如 getUTCFullYear())。
日期操作
通过 set 方法修改日期。它们会改变原始对象:
const date = new Date();date.setFullYear(2026);date.setMonth(0); // 一月date.setDate(15);console.log(date); // 2026-01-15T... (其他组件保持不变)陷阱: set 方法会自动调整日期。例如,如果设置为 1 月 32 日,日期将变为 2 月 1 日。这可能既方便又出乎意料。
2. 日期格式化与所需格式输出
内置方法 toLocaleDateString() 允许以特定区域设置的格式输出日期:
const date = new Date(2025, 11, 25);console.log(date.toLocaleDateString('ru-RU')); // 25.12.2025console.log(date.toLocaleDateString('en-US')); // 12/25/2025console.log(date.toLocaleDateString('de-DE')); // 25.12.2025对于更灵活的格式化,可以使用 Intl.DateTimeFormat:
const formatter = new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'});console.log(formatter.format(new Date())); // "четверг, 20 марта 2025 г., 17:45"然而,对于复杂格式(例如 "2025-03-20T14:30:00+03:00")或自定义模板,最好使用库(下文将介绍)。