Обзор библиотек для работы с датами в JavaScript (Node.js)
Работа с датами — одна из самых частых и одновременно сложных задач в веб-разработке. В JavaScript нативный объект Date имеет ряд недостатков: мутабельность, ограниченные возможности форматирования и парсинга, проблемы с часовыми поясами. К счастью, экосистема Node.js предлагает несколько мощных библиотек, которые значительно упрощают манипуляции с датами. В этой статье мы рассмотрим четыре самые популярные из них: Moment.js, Day.js, date-fns и Luxon.
1. Moment.js — классика жанра
Долгое время Moment.js был стандартом де-факто для работы с датами. Он предоставляет богатый API для парсинга, валидации, манипуляции и отображения дат. Однако библиотека считается устаревшей (maintenance mode) и не рекомендуется для новых проектов из-за большого размера (около 300 КБ) и проблем с производительностью.
Установка:
npm install moment
Примеры использования:
const moment = require('moment');
// Текущая дата
const now = moment();
console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-15 14:30:00
// Парсинг строки
const date = moment('2025-12-31', 'YYYY-MM-DD');
console.log(date.add(1, 'day').format('DD.MM.YYYY')); // 01.01.2026
// Разница между датами
const start = moment('2025-01-01');
const end = moment('2025-03-15');
console.log('Дней прошло:', end.diff(start, 'days')); // 73
2. Day.js — легковесная альтернатива
Day.js — это минималистичная библиотека (всего 2 КБ), которая полностью совместима по API с Moment.js. Она идеально подходит для проектов, где важен размер бандла. Day.js поддерживает плагины для расширения функциональности (часовые пояса, относительное время и т.д.).
Установка:
npm install dayjs
Примеры использования:
const dayjs = require('dayjs');
const relativeTime = require('dayjs/plugin/relativeTime');
const utc = require('dayjs/plugin/utc');
dayjs.extend(relativeTime);
dayjs.extend(utc);
// Текущая дата
console.log(dayjs().format('DD.MM.YYYY')); // 15.03.2025
// Относительное время
console.log(dayjs('2025-03-10').fromNow()); // 5 дней назад
// Работа с UTC
console.log(dayjs.utc().format()); // 2025-03-15T11:30:00Z
3. date-fns — функциональный подход
date-fns — это современная библиотека, построенная на принципах функционального программирования. В отличие от Moment.js, она не использует мутабельные объекты и поддерживает древовидную структуру (tree-shaking), что позволяет импортировать только нужные функции и уменьшить размер бандла.
Установка:
npm install date-fns
Примеры использования:
const { format, addDays, differenceInDays, parseISO } = require('date-fns');
const { ru } = require('date-fns/locale');
// Форматирование с локалью
console.log(format(new Date(), 'd MMMM yyyy', { locale: ru })); // 15 марта 2025
// Манипуляции
const future = addDays(new Date(), 10);
console.log(format(future, 'yyyy-MM-dd')); // 2025-03-25
// Разница
const d1 = parseISO('2025-01-01');
const d2 = new Date();
console.log('Дней с НГ:', differenceInDays(d2, d1)); // 73
4. Luxon — современный стандарт
Luxon — это библиотека от создателей Moment.js, но лишенная их недостатков. Она использует нативные объекты DateTime, Duration и Interval, поддерживает часовые пояса и интернационализацию "из коробки". Luxon идеально подходит для сложных сценариев с временными зонами.
Установка:
npm install luxon
Примеры использования:
const { DateTime, Interval } = require('luxon');
// Текущая дата с часовым поясом
const now = DateTime.now().setZone('Europe/Moscow');
console.log(now.toFormat('dd.MM.yyyy HH:mm')); // 15.03.2025 17:30
// Парсинг ISO
const dt = DateTime.fromISO('2025-12-31T23:59:59');
console.log(dt.plus({ days: 1 }).toISODate()); // 2026