Работа с датами в TypeScript: обзор популярных библиотек
Работа с датами и временем — одна из самых частых и при этом нетривиальных задач в веб-разработке. Встроенный объект Date в JavaScript (и TypeScript) имеет ряд недостатков: мутабельность, неинтуитивный API, проблемы с часовыми поясами и отсутствие удобных методов форматирования. К счастью, экосистема TypeScript предлагает несколько мощных библиотек, которые решают эти проблемы и предоставляют отличную поддержку типов.
В этой статье мы рассмотрим три наиболее популярные библиотеки: date-fns, Luxon и Day.js. Вы узнаете об их особенностях, преимуществах, недостатках и увидите примеры использования с TypeScript.
1. date-fns — модульная и функциональная
date-fns — это библиотека, построенная на принципах функционального программирования. Каждая функция — это отдельный модуль, что позволяет импортировать только то, что нужно, и значительно уменьшает размер бандла. В TypeScript библиотека имеет встроенные типы.
Установка
npm install date-fns
Примеры использования с TypeScript
import { format, addDays, differenceInDays, isAfter, parseISO } from 'date-fns';
// Форматирование даты
const today = new Date();
console.log(format(today, 'yyyy-MM-dd')); // '2025-03-20'
// Добавление дней
const nextWeek = addDays(today, 7);
console.log(format(nextWeek, 'dd.MM.yyyy')); // '27.03.2025'
// Разница между датами
const startDate = parseISO('2025-01-01');
const endDate = parseISO('2025-12-31');
const daysBetween = differenceInDays(endDate, startDate);
console.log(`Дней в 2025 году: ${daysBetween}`); // 364
// Сравнение дат
const isFuture = isAfter(parseISO('2025-06-01'), today);
console.log(`1 июня 2025 в будущем? ${isFuture}`); // true
Преимущества
- Древовидная тряска (tree-shaking) — импортируете только нужные функции, что уменьшает размер приложения.
- Иммутабельность — функции не изменяют исходные объекты, а возвращают новые.
- Поддержка TypeScript — полная типизация из коробки.
- Локализация — поддержка множества языков, включая русский.
Недостатки
- Работает с нативным
Date, что может быть неудобно при сложных операциях с часовыми поясами. - Нет встроенной поддержки неизменяемых объектов (как в Luxon).
2. Luxon — мощный и современный
Luxon — это библиотека от одного из авторов Moment.js, но без его недостатков. Она использует собственные неизменяемые объекты DateTime, Duration и Interval, что делает работу с датами интуитивной и безопасной. Luxon имеет отличную поддержку часовых поясов и локалей.
Установка
npm install luxon
Для TypeScript может потребоваться установка типов:
npm install --save-dev @types/luxon
Примеры использования с TypeScript
import { DateTime, Duration } from 'luxon';
// Создание и форматирование
const now = DateTime.now();
console.log(now.toFormat('yyyy-MM-dd HH:mm:ss')); // '2025-03-20 14:30:00'
// Работа с часовыми поясами
const moscowTime = DateTime.now().setZone('Europe/Moscow');
console.log(`Московское время: ${moscowTime.toFormat('HH:mm')}`);
// Добавление интервала
const nextMonth = now.plus({ months: 1 });
console.log(`Через месяц: ${nextMonth.toFormat('dd.MM.yyyy')}`);
// Разница между датами
const start = DateTime.fromISO('2025-01-01');
const end = DateTime.fromISO('2025-12-31');
const diff = end.diff(start, ['months', 'days']);
console.log(`Разница: ${diff.months} месяцев и ${diff.days} дней`);
// Работа с длительностями
const duration = Duration.fromObject({ hours: 2, minutes: 30 });
console.log(duration.toFormat('hh:mm')); // '02:30'
Преимущества
- Неизменяемость — все методы возвращают новые объекты.
- Глубокая поддержка часовых поясов — работает с IANA-таймзонами.
- Собственные типы данных —
DateTime, <
Также в библиотеке
Armadillo для C++: полное руководство с примерами
Генерация PDF на Go: обзор библиотек и примеры кода
Отправка SMS на C# (.NET): Интеграция с API SMS-сервисов через HttpClient