Работа с датами в TypeScript: обзор библиотек date-fns, Luxon и Day.js

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в 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, <

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