JavaScript (Node.js) 日期处理库概览
日期处理是 Web 开发中最常见也最复杂的任务之一。JavaScript 的原生 Date 对象存在诸多缺陷:可变性、格式化和解析功能有限、时区问题。幸运的是,Node.js 生态系统提供了几个强大的库,极大地简化了日期操作。本文将介绍其中最流行的四个库:Moment.js、Day.js、date-fns 和 Luxon。
1. Moment.js — 经典之作
长期以来,Moment.js 一直是日期处理的事实标准。它提供了丰富的 API,用于解析、验证、操作和显示日期。然而,该库已被视为过时(维护模式),由于体积较大(约 300 KB)和性能问题,不建议在新项目中使用。
安装:
npm install moment使用示例:
const moment = require('moment');
// 当前日期const now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-15 14:30:00
// 解析字符串const date = moment('2025-12-31', 'YYYY-MM-DD');console.log(date.add(1, 'day').format('DD.MM.YYYY')); // 01.01.2026
// 日期差const start = moment('2025-01-01');const end = moment('2025-03-15');console.log('已过天数:', end.diff(start, 'days')); // 732. Day.js — 轻量级替代方案
Day.js 是一个极简库(仅 2 KB),API 与 Moment.js 完全兼容。它非常适合注重包体积的项目。Day.js 支持通过插件扩展功能(时区、相对时间等)。
安装:
npm install dayjs使用示例:
const dayjs = require('dayjs');const relativeTime = require('dayjs/plugin/relativeTime');const utc = require('dayjs/plugin/utc');
dayjs.extend(relativeTime);dayjs.extend(utc);
// 当前日期console.log(dayjs().format('DD.MM.YYYY')); // 15.03.2025
// 相对时间console.log(dayjs('2025-03-10').fromNow()); // 5 天前
// UTC 操作console.log(dayjs.utc().format()); // 2025-03-15T11:30:00Z3. date-fns — 函数式方法
date-fns 是一个基于函数式编程原则的现代库。与 Moment.js 不同,它不使用可变对象,并支持树摇(tree-shaking),允许只导入所需函数,从而减小包体积。
安装:
npm install date-fns使用示例:
const { format, addDays, differenceInDays, parseISO } = require('date-fns');const { ru } = require('date-fns/locale');
// 带区域设置的格式化console.log(format(new Date(), 'd MMMM yyyy', { locale: ru })); // 15 марта 2025
// 操作const future = addDays(new Date(), 10);console.log(format(future, 'yyyy-MM-dd')); // 2025-03-25
// 差值const d1 = parseISO('2025-01-01');const d2 = new Date();console.log('新年至今天数:', differenceInDays(d2, d1)); // 734. Luxon — 现代标准
Luxon 由 Moment.js 的创建者开发,但摒弃了其缺点。它使用原生 DateTime、Duration 和 Interval 对象,开箱即用地支持时区和国际化。Luxon 非常适合复杂的时区场景。
安装:
npm install luxon