Что это за библиотека и зачем она нужна
Moment.js и Day.js — это две мощные библиотеки для JavaScript, предназначенные для работы с датами и временем. Они решают фундаментальную проблему: нативный объект Date в JavaScript крайне неудобен для повседневных задач. Он не поддерживает форматирование, сложные вычисления с датами, парсинг строк в разных форматах и работу с часовыми поясами без написания десятков строк кода.
Moment.js долгое время был стандартом де-факто, но сейчас считается "легаси" — его разработка заморожена, и он не рекомендуется для новых проектов из-за большого размера (около 300 КБ). На смену ему пришёл Day.js — лёгкая (всего 2 КБ) и быстрая библиотека с практически идентичным API. Day.js полностью совместима с Moment.js в большинстве базовых операций, что позволяет легко мигрировать.
Обе библиотеки предоставляют:
- Парсинг дат из строк любого формата
- Форматирование дат в удобочитаемые строки
- Манипуляции (добавление/вычитание дней, месяцев, лет)
- Сравнение дат (до, после, между)
- Работу с часовыми поясами (через плагины)
- Локализацию (поддержка разных языков и региональных форматов)
В этой статье мы будем рассматривать Day.js как современную альтернативу, но все примеры будут работать и с Moment.js с минимальными изменениями.
Установка
Установка для Node.js выполняется через npm или yarn. Для браузера можно использовать CDN.
Установка Day.js
# Через npm
npm install dayjs
# Через yarn
yarn add dayjs
Установка Moment.js
npm install moment
# или
yarn add moment
Подключение в проекте
// Day.js
const dayjs = require('dayjs');
// Moment.js
const moment = require('moment');
Быстрый старт с примером кода
После установки вы можете сразу начать работать с датами. Вот минимальный пример, который демонстрирует основные возможности:
const dayjs = require('dayjs');
// Текущая дата и время
const now = dayjs();
console.log('Сейчас:', now.format('DD.MM.YYYY HH:mm:ss'));
// Парсинг строки
const date = dayjs('2024-03-15');
console.log('Парсинг:', date.format('DD.MM.YYYY'));
// Манипуляции
const nextWeek = dayjs().add(7, 'day');
console.log('Через неделю:', nextWeek.format('DD.MM.YYYY'));
// Разница между датами
const diff = nextWeek.diff(now, 'day');
console.log('Разница в днях:', diff);
// Сравнение
console.log('Сегодня раньше?', now.isBefore(nextWeek)); // true
Основные методы/функции
1. dayjs() — создание объекта даты
Что делает: Создаёт объект Day.js, представляющий определённый момент времени. Без аргументов возвращает текущую дату и время.
Параметры:
date(необязательно) — строка, число (timestamp), объект Date или другой объект Day.jsformat(необязательно) — строка формата для парсинга, если date — строка
Рабочий пример кода:
// Текущая дата
const now = dayjs();
// Из строки
const fromString = dayjs('2024-12-31');
// Из timestamp (миллисекунды)
const fromTimestamp = dayjs(1704067200000);
// Из объекта Date
const fromDate = dayjs(new Date(2024, 0, 1)); // 1 января 2024
// С указанием формата
const customFormat = dayjs('31.12.2024', 'DD.MM.YYYY');
console.log(now.format()); // 2024-03-15T10:30:00+03:00
console.log(customFormat.format('YYYY-MM-DD')); // 2024-12-31
2. format() — форматирование даты
Что делает: Преобразует объект даты в строку по заданному шаблону. Без аргументов возвращает ISO-строку.
Параметры:
formatString(необязательно) — строка с токенами форматирования
Рабочий пример кода:
const date = dayjs('2024-03-15T14:30:00');
// Основные токены
console.log(date.format('YYYY-MM-DD')); // 2024-03-15
console.log(date.format('DD.MM.YYYY HH:mm:ss')); // 15.03.2024 14:30:00
console.log(date.format('dddd, MMMM D, YYYY')); // Friday, March 15, 2024
console.log(date.format('HH:mm')); // 14:30
console.log(date.format('YYYY')); // 2024
3. add() / subtract() — добавление и вычитание времени
Что делает: Позволяет прибавлять или вычитать единицы времени (дни, месяцы, годы, часы и т.д.) к текущей дате.
Параметры:
value— число (количество единиц)unit— строка (единица измерения: 'day', 'month', 'year', 'hour', 'minute', 'second', 'week')
Рабочий пример кода:
const today = dayjs();
// Добавление
const nextMonth = today.add(1, 'month');
const nextYear = today.add(1, 'year');
const twoWeeksLater = today.add(14, 'day');
// Вычитание
const yesterday = today.subtract(1, 'day');
const lastHour = today.subtract(1, 'hour');
console.log('Через месяц:', nextMonth.format('DD.MM.YYYY'));
console.log('Вчера:', yesterday.format('DD.MM.YYYY'));
// Цепочка методов
const complex = dayjs().add(1, 'year').subtract(3, 'month').add(5, 'day');
console.log('Сложная операция:', complex.format('DD.MM.YYYY'));
4. diff() — разница между датами
Что делает: Вычисляет разницу между двумя датами в указанных единицах измерения.
Параметры:
comparedDate— объект Day.js, строка или Dateunit(необязательно) — единица измерения ('day', 'month', 'year', 'hour', 'minute', 'second')float(необязательно) — boolean, возвращать ли дробное значение
Рабочий пример кода:
const start = dayjs('2024-01-01');
const end = dayjs('2024-12-31');
// Разница в днях
const daysDiff = end.diff(start, 'day');
console.log('Дней между датами:', daysDiff); // 365
// Разница в месяцах
const monthsDiff = end.diff(start, 'month');
console.log('Месяцев:', monthsDiff); // 11
// С дробной частью
const exactDiff = end.diff(start, 'year', true);
console.log('Лет точно:', exactDiff); // 0.997...
// Разница от текущей даты
const birthDate = dayjs('1990-06-15');
const ageInYears = dayjs().diff(birthDate, 'year');
console.log('Возраст:', ageInYears);
5. isBefore() / isAfter() / isSame() — сравнение дат
Что делает: Позволяют сравнивать две даты: определить, находится ли одна дата до, после или равна другой.
Параметры:
comparedDate— объект Day.js, строка или Dateunit(необязательно) — единица измерения для сравнения (например, 'year' для сравнения только по году)
Рабочий пример кода:
const today = dayjs();
const tomorrow = dayjs().add(1, 'day');
const yesterday = dayjs().subtract(1, 'day');
console.log('Сегодня до завтра?', today.isBefore(tomorrow)); // true
console.log('Сегодня после вчера?', today.isAfter(yesterday)); // true
console.log('Сегодня равно сегодня?', today.isSame(dayjs())); // true
// Сравнение по году
const date1 = dayjs('2024-06-15');
const date2 = dayjs('2024-12-31');
console.log('Оба в 2024?', date1.isSame(date2, 'year')); // true
// Проверка на сегодня
console.log('Сегодня?', dayjs().isSame(today, 'day')); // true
6. startOf() / endOf() — начало и конец периода
Что делает: Возвращает дату, установленную на начало или конец указанного периода (дня, месяца, года и т.д.).
Параметры:
unit— строка ('year', 'month', 'week', 'day', 'hour', 'minute', 'second')
Рабочий пример кода:
const now = dayjs('2024-03-15T14:30:45');
// Начало дня (00:00:00)
const startOfDay = now.startOf('day');
console.log('Начало дня:', startOfDay.format('DD.MM.YYYY HH:mm:ss')); // 15.03.2024 00:00:00
// Конец месяца
const endOfMonth = now.endOf('month');
console.log('Конец месяца:', endOfMonth.format('DD.MM.YYYY')); // 31.03.2024
// Начало года
const startOfYear = now.startOf('year');
console.log('Начало года:', startOfYear.format('DD.MM.YYYY')); // 01.01.2024
// Начало недели (воскресенье по умолчанию)
const startOfWeek = now.startOf('week');
console.log('Начало недели:', startOfWeek.format('DD.MM.YYYY dddd'));
7. get() / set() — получение и установка компонентов даты
Что делает: Позволяют получать или устанавливать отдельные компоненты даты (год, месяц, день, час и т.д.).
Параметры:
unit— строка ('year', 'month', 'date', 'day', 'hour', 'minute', 'second', 'millisecond')value(только для set) — новое значение
Рабочий пример кода:
const date = dayjs('2024-03-15');
// Получение
console.log('Год:', date.get('year')); // 2024
console.log('Месяц (0-11):', date.get('month')); // 2 (март)
console.log('День месяца:', date.get('date')); // 15
console.log('День недели (0-6):', date.get('day')); // 5 (пятница)
// Установка
const modified = date.set('year', 2025).set('month', 11).set('date', 25);
console.log('Изменённая дата:', modified.format('DD.MM.YYYY')); // 25.12.2025
// Установка с проверкой
const feb29 = dayjs('2024-02-29'); // високосный год
const invalid = feb29.set('year', 2023); // 2023 не високосный
console.log('Корректировка:', invalid.format('DD.MM.YYYY')); // 28.02.2023 (автокоррекция)