Работа с датами в 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); // 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 — лёгкая и быстра

Рекомендаций