Работа с датами в JavaScript (Node.js): обзор популярных библиотек
Работа с датами и временем — одна из самых частых задач в веб-разработке. Встроенный объект Date в JavaScript (Node.js) предоставляет базовые возможности, но часто оказывается неудобным и ограниченным: отсутствие удобного форматирования, парсинга, манипуляций с временными зонами и разницы между датами. К счастью, существует несколько зрелых библиотек, которые решают эти проблемы. В этой статье мы рассмотрим четыре наиболее популярных инструмента для работы с датами в Node.js.
1. Moment.js — классика (но с оговорками)
Moment.js долгое время была стандартом де-факто для работы с датами в JavaScript. Она предоставляет богатый API для парсинга, валидации, форматирования и манипуляций с датами.
Установка:
npm install moment
Пример использования:
const moment = require('moment');
// Текущая дата и время
const now = moment();
console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-21 14:30:00
// Парсинг строки
const date = moment('2025-12-25', 'YYYY-MM-DD');
console.log(date.format('dddd, MMMM Do YYYY')); // Thursday, December 25th 2025
// Манипуляции
const future = moment().add(7, 'days').subtract(2, 'hours');
console.log(future.fromNow()); // "in 6 days"
// Разница между датами
const a = moment('2025-01-01');
const b = moment('2025-03-21');
console.log(b.diff(a, 'days')); // 79
Плюсы: огромное сообщество, детальная документация, множество плагинов (работа с часовыми поясами, локализация).
Минусы: библиотека устарела (режим поддержки), большой размер (~230 KB), мутирующие методы (изменяют исходный объект). Разработчики рекомендуют использовать современные альтернативы.
2. date-fns — модульный и функциональный подход
date-fns — это современная библиотека, построенная на принципах функционального программирования. Каждая функция — это отдельный модуль, что позволяет подключать только нужные части и уменьшать размер бандла.
Установка:
npm install date-fns
Пример использования:
const { format, addDays, subHours, differenceInDays, parseISO } = require('date-fns');
// Форматирование
const now = new Date();
console.log(format(now, 'yyyy-MM-dd HH:mm:ss')); // 2025-03-21 14:30:00
// Манипуляции (иммутабельно — создаётся новый объект)
const future = addDays(now, 7);
const adjusted = subHours(future, 2);
console.log(format(adjusted, 'dd.MM.yyyy')); // 28.03.2025
// Разница
const start = parseISO('2025-01-01');
const end = new Date();
console.log(differenceInDays(end, start)); // 79
// Локализация (русская)
const { ru } = require('date-fns/locale');
console.log(format(now, 'PPPP', { locale: ru })); // "пятница, 21 марта 2025 г."
Плюсы: модульность, иммутабельность (не меняет исходные объекты), TypeScript-поддержка, отличная документация.
Минусы: требуется Node.js 14+, нет встроенной поддержки часовых поясов (требуется date-fns-tz).
3. Day.js — лёгкая и быстрая альтернатива Moment.js
Day.js — это минималистичная библиотека (всего 2 KB), которая имеет API, почти полностью совместимый с Moment.js. Она идеально подходит, если нужно заменить Moment.js без переписывания кода.
Установка:
npm install dayjs
Пример использования:
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const relativeTime = require('dayjs/plugin/relativeTime');
dayjs.extend(utc);
dayjs.extend(relativeTime);
// Базовое использование (как в Moment)
const now = dayjs();
console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-21 14:30:00
// Работа с UTC
const utcDate = dayjs.utc();
console.log(utcDate.format()); // 2025-03-21T11:30:00Z
// Относительное время
console.log(dayjs('2025-03-20').fromNow()); // "a day ago"
// Разница
const a = dayjs('2025-01-01');
const b = dayjs('2025-03-21');
console.log(b.diff(a, 'day')); // 79
П