在 JavaScript (Node.js) 中处理日期:最佳库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 JavaScript (Node.js) 中处理日期:热门库概览



日期和时间处理是 Web 开发中的常见任务之一。JavaScript 内置的 Date 对象功能有限且 API 不便。幸运的是,Node.js 有许多库可以简化日期的解析、格式化、操作和比较。在本文中,我们将介绍四个最流行的库:Moment.js、Day.js、date-fns 和 Luxon。



1. Moment.js(传奇但已过时)



Moment.js 长期以来一直是处理日期的事实标准。它提供了丰富的 API 用于解析、验证、操作和格式化。然而,该项目已被官方宣布为遗留项目——开发者建议使用现代替代方案。主要缺点:体积大(约 300 KB)、方法会改变原始对象(mutating methods)以及 Tree Shaking 问题。



// 安装: npm install momentconst moment = require('moment');

// 解析和格式化const now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2024-01-15 14:30:00

// 操作const future = moment().add(7, 'days').startOf('week');console.log(future.format('dddd, MMMM Do YYYY')); // Monday, January 22nd 2024

// 日期差异const a = moment('2024-01-01');const b = moment('2024-01-10');console.log(b.diff(a, 'days')); // 9


2. Day.js(轻量级继承者)



Day.js 是一个现代库,API 与 Moment.js 相同,但体积仅为 2 KB。它完全不可变(不改变原始对象),支持插件,并且与 Tree Shaking 配合良好。非常适合注重包大小的项目。



// 安装: npm install dayjsconst dayjs = require('dayjs');const relativeTime = require('dayjs/plugin/relativeTime');dayjs.extend(relativeTime);

const now = dayjs();console.log(now.format('DD.MM.YYYY')); // 15.01.2024

// 处理时区(需要 utc 插件)const utc = require('dayjs/plugin/utc');dayjs.extend(utc);const date = dayjs.utc('2024-01-15T12:00:00Z').local();console.log(date.format('HH:mm')); // 15:00(取决于时区)

// 相对时间console.log(dayjs('2023-12-25').fromNow()); // 3 weeks ago


3. date-fns(函数式方法)



date-fns 是一个基于函数式编程原则构建的库。它不提供单一对象,而是提供许多纯函数。每个函数都可以单独导入,从而只打包所需的代码。这是所列库中性能最高、模块化程度最高的。



// 安装: npm install date-fnsconst { format, addDays, differenceInDays, startOfWeek } = require('date-fns');const { ru } = require('date-fns/locale');

const now = new Date();

// 带本地化的格式化console.log(format(now, 'PPPP', { locale: ru })); // понедельник, 15 января 2024 г.

// 操作(纯函数)const nextWeek = addDays(now, 7);console.log(format(nextWeek, 'yyyy-MM-dd')); // 2024-01-22

// 差异const start = new Date(2024, 0, 1);console.log(differenceInDays(now, start)); // 14

// 一周的开始const monday = startOfWeek(now, { weekStartsOn: 1 });console.log(format(monday, 'dd.MM.yyyy')); // 15.01.2024


4. Luxon(来自 Moment.js 创建者的现代标准)



Luxon 是由与 Moment.js 相同的开发者创建的库,但摒弃了其缺点。它使用原生的 DateTime、Duration 和 Interval 对象,完全不可变,并内置支持时区和国际化。推荐用于新项目。



// 安装: npm install luxonconst { DateTime, Duration, Inte                    

推荐