TypeScript 中的日期处理:date-fns、Luxon 和 Day.js 库概览

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

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

开始课程

TypeScript 中的日期处理:最佳库概览



TypeScript 作为 JavaScript 的严格类型超集,继承了原生 Date 对象在日期处理方面的所有问题——不直观的 API、可变性、时区问题和解析问题。幸运的是,TypeScript 生态系统提供了几个强大的库来解决这些问题。在本文中,我们将介绍三种最流行的工具:date-fns、Luxon 和 Day.js,比较它们的功能,并提供实用的代码示例。



1. date-fns — 模块化且函数式



date-fns 是一个基于函数式编程原则构建的库。它由许多独立的函数组成,允许只导入所需的部分,而不会增加打包体积。它使用原生的 Date 对象,简化了集成。



主要特点:

  • 纯函数:每个函数都返回一个新对象,不会修改原始对象。
  • 模块化:只导入所需的函数(例如 import { format, addDays } from 'date-fns')。
  • 区域设置支持:内置支持超过 50 种语言,包括俄语。
  • TypeScript:开箱即用的优秀类型定义。


date-fns 代码示例



安装:

npm install date-fns


日期格式化:

import { format } from 'date-fns';import { ru } from 'date-fns/locale';

const date = new Date(2024, 11, 25); // 2024年12月25日const formatted = format(date, 'dd MMMM yyyy', { locale: ru });console.log(formatted); // "25 декабря 2024"


日期操作:

import { addDays, subMonths, differenceInDays } from 'date-fns';

const today = new Date();const future = addDays(today, 10);const past = subMonths(today, 3);const diff = differenceInDays(future, past);console.log(`相差:${diff} 天`);


日期比较:

import { isBefore, isAfter, isEqual } from 'date-fns';

const date1 = new Date(2024, 0, 1);const date2 = new Date(2024, 6, 1);console.log(isBefore(date1, date2)); // true


2. Luxon — 强大且现代



Luxon 是由 Moment.js 的一位作者创建的库,旨在解决其缺点。Luxon 使用自己不可变的对象(DateTime、Duration),而不是原生的 Date。这使得它在处理时区和时间间隔方面特别方便。



主要特点:

  • 不可变性:所有方法都返回新实例。
  • 内置时区支持:无需额外插件。
  • 国际化:基于 Intl API 的本地化。
  • 处理间隔和持续时间:用于计算时间段的便捷方法。


Luxon 代码示例



安装:

npm install luxon


创建和格式化日期:

import { DateTime } from 'luxon';

const dt = DateTime.fromISO('2024-12-25', { zone: 'Europe/Moscow' });console.log(dt.toFormat('dd.MM.yyyy HH:mm')); // "25.12.2024 00:00"

// 本地化输出console.log(dt.setLocale('ru').toFormat('d MMMM yyyy')); // "25 декабря 2024"


时区处理:

const nyTime = DateTime.now().setZone('America/New_York');const moscowTime = nyTime.setZone('Europe/Moscow');console.log(`纽约时间:${nyTime.toFormat('HH:mm')},莫斯科时间:${moscowTime.toFormat('HH:mm')}`);


持续时间和间隔:

import { Duration, Interval } from 'luxon';

const dur = Durati

推荐