Работа с датами в 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
// Разница между датами Также в библиотеке
Chalk для JavaScript (Node.js): полное руководство с примерами
Rate Limiting в Kotlin: библиотеки и реализация
GraphQL Java: мощный инструмент для создания современных API на Java
Очереди задач для Rust: Обзор популярных библиотек и инструментов
Интернационализация (i18n) в C# (.NET): полное руководство