Moment.js / Day.js для JavaScript (Node.js): полное руководство с примерами

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

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

Начать курс

Что это за библиотека и зачем она нужна

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.js
  • format (необязательно) — строка формата для парсинга, если 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, строка или Date
  • unit (необязательно) — единица измерения ('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, строка или Date
  • unit (необязательно) — единица измерения для сравнения (например, '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 (автокоррекция)

8. un

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