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)); // true2. 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