Работа с датами в JavaScript (Node.js): лучшие библиотеки

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

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

Начать курс

Работа с датами в JavaScript (Node.js): обзор популярных библиотек

Работа с датами и временем — одна из частых задач в веб-разработке. Встроенный объект Date в JavaScript имеет ограниченный функционал и неудобный API. К счастью, для Node.js существует множество библиотек, упрощающих парсинг, форматирование, манипуляции и сравнение дат. В этой статье мы рассмотрим четыре наиболее популярные библиотеки: Moment.js, Day.js, date-fns и Luxon.

1. Moment.js (легендарная, но устаревшая)

Moment.js долгое время была стандартом де-факто для работы с датами. Она предоставляет богатый API для парсинга, валидации, манипуляций и форматирования. Однако проект официально признан устаревшим (legacy) — разработчики рекомендуют использовать современные альтернативы. Основные минусы: большой размер ( ~300 KB), мутирующие методы (меняют исходный объект) и проблемы с Tree Shaking.

// Установка: npm install moment
const moment = require('moment');

// Парсинг и форматирование
const now = moment();
console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2024-01-15 14:30:00

// Манипуляции
const future = moment().add(7, 'days').startOf('week');
console.log(future.format('dddd, MMMM Do YYYY')); // Monday, January 22nd 2024

// Разница между датами
const a = moment('2024-01-01');
const b = moment('2024-01-10');
console.log(b.diff(a, 'days')); // 9

2. Day.js (легковесный преемник)

Day.js — современная библиотека с тем же API, что и Moment.js, но размером всего 2 KB. Она полностью иммутабельна (не изменяет исходные объекты), поддерживает плагины и отлично работает с Tree Shaking. Идеально подходит для проектов, где важен размер бандла.

// Установка: npm install dayjs
const dayjs = require('dayjs');
const relativeTime = require('dayjs/plugin/relativeTime');
dayjs.extend(relativeTime);

const now = dayjs();
console.log(now.format('DD.MM.YYYY')); // 15.01.2024

// Работа с временными зонами (требуется плагин utc)
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
const date = dayjs.utc('2024-01-15T12:00:00Z').local();
console.log(date.format('HH:mm')); // 15:00 (зависит от часового пояса)

// Относительное время
console.log(dayjs('2023-12-25').fromNow()); // 3 weeks ago

3. date-fns (функциональный подход)

date-fns — библиотека, построенная на принципах функционального программирования. Вместо единого объекта она предоставляет множество чистых функций. Каждая функция импортируется отдельно, что позволяет собирать только нужный код. Это самая производительная и модульная библиотека из перечисленных.

// Установка: npm install date-fns
const { format, addDays, differenceInDays, startOfWeek } = require('date-fns');
const { ru } = require('date-fns/locale');

const now = new Date();

// Форматирование с локализацией
console.log(format(now, 'PPPP', { locale: ru })); // понедельник, 15 января 2024 г.

// Манипуляции (чистые функции)
const nextWeek = addDays(now, 7);
console.log(format(nextWeek, 'yyyy-MM-dd')); // 2024-01-22

// Разница
const start = new Date(2024, 0, 1);
console.log(differenceInDays(now, start)); // 14

// Начало недели
const monday = startOfWeek(now, { weekStartsOn: 1 });
console.log(format(monday, 'dd.MM.yyyy')); // 15.01.2024

4. Luxon (современный стандарт от создателей Moment.js)

Luxon — библиотека от тех же разработчиков, что и Moment.js, но лишенная её недостатков. Она использует нативные объекты DateTime, Duration и Interval, полностью иммутабельна, поддерживает временные зоны и интернационализацию "из коробки". Рекомендуется для новых проектов.

// Установка: npm install luxon
const { DateTime, Duration, Interval } = require('luxon');

// Создание и форматирование
const now = DateTime.now();
console.log(now.toFormat('yyyy LLL dd')); // 2024 Jan 15

// Работа с временными зонами
const ny = DateTime.now().setZone('America/New_York');
console.log(ny.toFormat('HH:mm')); // 09:30 (если в UTC 14:30)

// Манипуляции
const future = now.plus({ days: 10, hours: 5 });
console.log(future.toRelative()); // in 10 days

// Разница между датами                    

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