Temporal API в будущем JavaScript

Moment.js — это библиотека для работы с датами и временем в JavaScript, обеспечивающая удобное создание, парсинг, форматирование и манипуляцию датами. Она решает множество проблем, связанных с нативным объектом Date, таких как часовые пояса, сложные форматы и локализация.

Создание объекта Moment может выполняться несколькими способами:

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

// Конкретная дата
const birthday = moment("1990-12-17");

// С помощью отдельных компонентов
const customDate = moment({ year: 2026, month: 4, day: 22, hour: 15, minute: 30 });

Важно помнить, что месяцы в Moment.js индексируются с нуля, то есть 0 — это январь, а 11 — декабрь.


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

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

const date = moment("2026-05-22T14:45:00");

// Форматирование по шаблону
date.format("YYYY-MM-DD HH:mm:ss"); // "2026-05-22 14:45:00"

// Отображение месяца буквами
date.format("DD MMMM YYYY"); // "22 мая 2026"

// Использование локализации
moment.locale('ru');
date.format('LLLL'); // "пятница, 22 мая 2026 г., 14:45"

Ключевые символы форматирования:

  • YYYY — полный год,
  • MM — месяц с ведущим нулем,
  • DD — день месяца с ведущим нулем,
  • HH — часы 24-часового формата,
  • mm — минуты,
  • ss — секунды,
  • dddd — полное название дня недели,
  • MMM / MMMM — сокращённое / полное название месяца.

Парсинг строк в дату

Moment.js позволяет создавать объекты даты из строк с указанием формата:

const date1 = moment("22-05-2026", "DD-MM-YYYY");
const date2 = moment("2026/05/22 14:45", "YYYY/MM/DD HH:mm");

Если формат строки совпадает с указанным, Moment корректно распознаёт дату. В противном случае возвращается некорректный объект (Invalid Date).


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

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

let date = moment("2026-05-22");

// Добавление дней, месяцев, лет
date.add(5, 'days'); // 27 мая 2026
date.add(2, 'months'); // 27 июля 2026
date.add(1, 'years'); // 27 июля 2027

// Вычитание
date.subtract(3, 'days'); // 24 июля 2027

Допустимые единицы: years, months, weeks, days, hours, minutes, seconds.


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

Сравнение объектов Moment выполняется с помощью специальных методов:

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
date1.isSame(date2, 'year');  // true

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

Moment.js поддерживает измерение разницы между датами через метод diff:

const start = moment("2026-05-01");
const end = moment("2026-05-22");

const daysDiff = end.diff(start, 'days'); // 21
const monthsDiff = end.diff(start, 'months'); // 0

Метод diff возвращает целое число по указанной единице, округляя вниз.


Локализация

Moment.js полностью поддерживает международные форматы и локализацию:

moment.locale('fr');
const date = moment("2026-05-22");
date.format('LLLL'); // "vendredi 22 mai 2026 00:00"

Доступны сотни локалей, которые можно подключать через отдельные файлы.


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

Хотя базовый Moment.js не имеет встроенной поддержки диапазонов, библиотека Moment Range расширяет возможности:

const start = moment("2026-05-01");
const end = moment("2026-05-22");
const range = moment.range(start, end);

range.contains(moment("2026-05-10")); // true
range.diff('days'); // 21

Преобразование и совместимость

Moment.js умеет конвертировать даты в JavaScript Date и обратно:

const jsDate = moment().toDate();
const momentDate = moment(new Date());

Также можно работать с UNIX-временем:

const unixTime = moment().unix(); // количество секунд с 1970-01-01
const fromUnix = moment.unix(unixTime); // обратно в Moment

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

Для работы с часовыми поясами используется расширение Moment Timezone:

const m = moment.tz("2026-05-22 14:00", "Europe/Moscow");
m.format(); // "2026-05-22T14:00:00+03:00"

m.tz("America/New_York").format(); // "2026-05-22T07:00:00-04:00"

Moment Timezone учитывает переход на летнее/зимнее время и позволяет выполнять точные преобразования между зонами.


Итоги использования

Moment.js обеспечивает комплексную работу с датами и временем, поддерживает локализацию, временные зоны, удобное форматирование, сравнение и манипуляции с датами. Несмотря на появление нативного Temporal API, Moment.js остаётся популярным инструментом для проектов, где требуется совместимость и простота кода.

Её возможности особенно ценны при работе с приложениями, требующими точных расчётов дат и сложных временных операций.