在 JavaScript (Node.js) 中处理日期:热门库概览
日期和时间处理是 Web 开发中最常见的任务之一。JavaScript (Node.js) 内置的 Date 对象提供了基本功能,但通常显得不便且有限:缺乏方便的格式化、解析、时区操作以及日期差异计算。幸运的是,有几个成熟的库可以解决这些问题。在本文中,我们将介绍 Node.js 中四种最流行的日期处理工具。
1. Moment.js — 经典(但有注意事项)
Moment.js 长期以来一直是 JavaScript 中日期处理的事实标准。它提供了丰富的 API,用于解析、验证、格式化和操作日期。
安装:
npm install moment使用示例:
const moment = require('moment');
// 当前日期和时间const now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-21 14:30:00
// 解析字符串const date = moment('2025-12-25', 'YYYY-MM-DD');console.log(date.format('dddd, MMMM Do YYYY')); // Thursday, December 25th 2025
// 操作const future = moment().add(7, 'days').subtract(2, 'hours');console.log(future.fromNow()); // "in 6 days"
// 日期差异const a = moment('2025-01-01');const b = moment('2025-03-21');console.log(b.diff(a, 'days')); // 79优点:庞大的社区、详细的文档、众多插件(时区处理、本地化)。
缺点:库已过时(维护模式)、体积大(约 230 KB)、方法会改变原对象(可变性)。开发者建议使用现代替代方案。
2. date-fns — 模块化和函数式方法
date-fns 是一个基于函数式编程原则构建的现代库。每个函数都是一个独立的模块,允许只引入所需部分,从而减小打包体积。
安装:
npm install date-fns使用示例:
const { format, addDays, subHours, differenceInDays, parseISO } = require('date-fns');
// 格式化const now = new Date();console.log(format(now, 'yyyy-MM-dd HH:mm:ss')); // 2025-03-21 14:30:00
// 操作(不可变性 — 创建新对象)const future = addDays(now, 7);const adjusted = subHours(future, 2);console.log(format(adjusted, 'dd.MM.yyyy')); // 28.03.2025
// 差异const start = parseISO('2025-01-01');const end = new Date();console.log(differenceInDays(end, start)); // 79
// 本地化(俄语)const { ru } = require('date-fns/locale');console.log(format(now, 'PPPP', { locale: ru })); // "пятница, 21 марта 2025 г."优点:模块化、不可变性(不改变原对象)、TypeScript 支持、优秀的文档。
缺点:需要 Node.js 14+,没有内置时区支持(需要 date-fns-tz)。
3. Day.js — Moment.js 的轻量快速替代方案
Day.js 是一个极简库(仅 2 KB),其 API 几乎与 Moment.js 完全兼容。如果需要在不重写代码的情况下替换 Moment.js,它是理想选择。
安装:
npm install dayjs使用示例:
const dayjs = require('dayjs');const utc = require('dayjs/plugin/utc');const relativeTime = require('dayjs/plugin/relativeTime');
dayjs.extend(utc);dayjs.extend(relativeTime);
// 基本使用(与 Moment 类似)const now = dayjs();console.log(now