Статус maintenance mode

Moment.js — это библиотека для работы с датами и временем в JavaScript, предоставляющая удобные методы для парсинга, форматирования, манипуляции и сравнения дат. Для использования Moment.js необходимо подключить библиотеку к проекту. Существует несколько способов:

// Через npm
npm install moment

// Подключение в проекте
const moment = require('moment');

// Через CDN в HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>

После подключения можно создавать объекты Moment и выполнять с ними различные операции.


Создание объектов Moment

Объект Moment создаётся с помощью функции moment(). Она принимает различные типы аргументов:

// Текущая дата и время
const now = moment();

// Конкретная дата
const date1 = moment("2026-05-22");

// Дата и время с форматом
const date2 = moment("2026-05-22 14:30", "YYYY-MM-DD HH:mm");

// Из объекта Date
const date3 = moment(new Date());

Ключевой момент: Moment автоматически распознаёт большинство стандартных форматов даты и времени, но при нестандартных форматах рекомендуется явно указывать шаблон для корректного парсинга.


Форматирование дат

Форматирование позволяет преобразовать объект Moment в строку нужного вида. Основные методы и шаблоны:

const now = moment();

// Полная дата
console.log(now.format("YYYY-MM-DD")); // 2026-05-22

// Дата и время
console.log(now.format("YYYY-MM-DD HH:mm:ss")); // 2026-05-22 14:30:15

// День недели
console.log(now.format("dddd")); // Пятница

// Месяц и день
console.log(now.format("MMMM Do")); // Май 22-й

Важное замечание: Шаблоны чувствительны к регистру: MM — месяц, mm — минуты.


Манипуляции с датами

Moment.js предоставляет мощные методы для добавления и вычитания времени:

const today = moment();

// Добавление дней, месяцев, лет
const nextWeek = today.add(7, 'days');
const nextMonth = today.add(1, 'months');
const nextYear = today.add(1, 'years');

// Вычитание времени
const lastWeek = today.subtract(7, 'days');

Поддерживаются единицы времени:

  • years, y — годы
  • months, M — месяцы
  • weeks, w — недели
  • days, d — дни
  • hours, h — часы
  • minutes, m — минуты
  • seconds, s — секунды
  • milliseconds, ms — миллисекунды

Совет: Методы add и subtract изменяют исходный объект Moment, поэтому для сохранения оригинальной даты следует использовать метод clone().


Сравнение дат

Для проверки порядка дат можно использовать методы:

const date1 = moment("2026-05-22");
const date2 = moment("2026-06-01");

date1.isBefore(date2); // true
date1.isAfter(date2);  // false
date1.isSame(date2);   // false

Также можно сравнивать даты по конкретной единице:

date1.isSame(date2, 'month'); // false

Работа с временными зонами

Для работы с часовыми поясами используется Moment Timezone (дополнение к Moment.js):

const moment = require('moment-timezone');

const moscowTime = moment.tz("2026-05-22 14:00", "Europe/Moscow");
const newYorkTime = moscowTime.clone().tz("America/New_York");

console.log(moscowTime.format());   // 2026-05-22T14:00:00+03:00
console.log(newYorkTime.format());  // 2026-05-22T07:00:00-04:00

Ключевой момент: Без Moment Timezone библиотека работает только с локальной и UTC временной зоной.


Парсинг строк и строгий режим

Метод moment() может использовать строгий режим для точного соответствия формату:

const date = moment("22-05-2026", "DD-MM-YYYY", true);
console.log(date.isValid()); // true

const invalidDate = moment("05/22/2026", "DD-MM-YYYY", true);
console.log(invalidDate.isValid()); // false

Важно: В строгом режиме формат должен полностью соответствовать шаблону, иначе дата будет считаться недействительной.


Локализация и форматы

Moment.js поддерживает множество локалей, что позволяет выводить дату на нужном языке:

moment.locale('ru');
const now = moment();
console.log(now.format('LLLL')); // пятница, 22 мая 2026 г., 14:30

Смена локали глобально влияет на все объекты Moment.


Дополнительные функции

  • fromNow() — возвращает относительное время:
const past = moment("2026-05-20");
console.log(past.fromNow()); // 2 дня назад
  • calendar() — отображает дату относительно текущего времени в календарном виде:
console.log(moment().calendar()); // Сегодня в 14:30
  • diff() — вычисляет разницу между датами:
const date1 = moment("2026-05-22");
const date2 = moment("2026-06-01");
console.log(date2.diff(date1, 'days')); // 10

Поддержка форматов ISO 8601

Moment.js корректно работает с ISO 8601:

const isoDate = moment("2026-05-22T14:30:00Z");
console.log(isoDate.format()); // 2026-05-22T14:30:00Z

Это упрощает обмен датами с API и внешними сервисами.


Производительность и рекомендации

  • Moment.js изменяет объекты при манипуляции, поэтому лучше использовать clone() для сохранения оригинала.
  • Для новых проектов рекомендуется рассматривать современные альтернативы, такие как Luxon или Day.js, так как Moment.js находится в статусе maintenance mode и не планирует активного развития, но продолжает получать критические исправления и поддержку совместимости.

Статус maintenance mode

Moment.js официально объявлен библиотекой в режиме поддержки (maintenance mode). Это означает:

  • Новые функции и крупные изменения не разрабатываются.
  • Исправления безопасности и багов выпускаются при необходимости.
  • Для новых проектов рекомендуется использовать более современные и модульные решения, но существующие проекты могут продолжать безопасно использовать Moment.js.

Ключевой вывод: Moment.js остаётся стабильным и надёжным для существующих проектов, однако активного развития функционала не будет.