Работа с датами в 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); // 25 декабря 2024
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 = Duration.fromObject({ hours: 5, minutes: 30 });
console.log(dur.toFormat('h:mm')); // "5:30"
const start = DateTime.fromISO('2024-01-01');
const end = DateTime.fromISO('2024-12-31');
const interval = Interval.fromDateTimes(start, end);
console.log(interval.length('days')); // 365
3. Day.js — лёгкая и быстра
Также в библиотеке
Отправка email на Kotlin: библиотеки, примеры и настройка SMTP
Генерация PDF в Java: обзор лучших библиотек (iText, Apache PDFBox, OpenPDF)
Работа с изображениями в Rust: обзор библиотек image, fast_image_resize и others