date-fns и функциональный подход

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

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

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

// Создание даты из строки
const dateFromString = moment("2026-05-22");

// Создание даты с указанием формата
const dateWithFormat = moment("22-05-2026", "DD-MM-YYYY");

// Создание даты с использованием компонентов
const dateFromComponents = moment({ year: 2026, month: 4, day: 22 });

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


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

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

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

date.format("YYYY-MM-DD"); // 2026-05-22
date.format("DD/MM/YYYY"); // 22/05/2026
date.format("dddd, MMMM Do YYYY"); // пятница, Май 22-й 2026

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

  • YYYY — полный год (2026)
  • YY — последние две цифры года (26)
  • MM — месяц с ведущим нулем (05)
  • M — месяц без ведущего нуля (5)
  • DD — день месяца с ведущим нулем (22)
  • D — день месяца без ведущего нуля (22)
  • dddd — полное название дня недели (пятница)
  • Do — день месяца с суффиксом (22-й)

Форматирование позволяет легко превращать даты в строки для отображения в интерфейсе.


Парсинг и валидация

Парсинг даты из строки требует указания формата, если он нестандартный. Метод moment(string, format) пытается интерпретировать строку согласно формату.

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

Метод isValid() проверяет корректность даты, что полезно при обработке пользовательского ввода.


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

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

  • add(value, unit) — прибавление
  • subtract(value, unit) — вычитание
  • startOf(unit) — начало периода
  • endOf(unit) — конец периода
const date = moment("2026-05-22");

date.add(5, "days"); // 2026-05-27
date.subtract(1, "months"); // 2026-04-27
date.startOf("month"); // 2026-04-01
date.endOf("year"); // 2026-12-31

Единицы измерения (unit):

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

Разница между датами

Для вычисления разницы между датами используется метод diff(). Он возвращает разницу в указанной единице времени:

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

console.log(end.diff(start, "days")); // 21
console.log(end.diff(start, "weeks")); // 3
console.log(end.diff(start, "months")); // 0

Метод diff() учитывает целые единицы времени. Для более точного расчета можно использовать дробные значения:

console.log(end.diff(start, "weeks", true)); // 3.0

Локализация

Moment.js поддерживает локализацию дат для разных языков. Локаль задается методом locale():

moment.locale("ru"); // русский язык

const date = moment("2026-05-22");
console.log(date.format("LLLL")); // пятница, 22 мая 2026 г., 00:00

Локализация влияет на названия месяцев, дней недели и формат вывода.


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

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

const m = moment.tz("2026-05-22 12:00", "Europe/Moscow");
console.log(m.format()); // 2026-05-22T12:00:00+03:00

Метод tz() позволяет конвертировать дату в другой часовой пояс:

const nyTime = m.clone().tz("America/New_York");
console.log(nyTime.format()); // 2026-05-22T05:00:00-04:00

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

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

  • isBefore() — проверка, что дата раньше другой
  • isAfter() — проверка, что дата позже другой
  • isSame() — проверка равенства дат
const date1 = moment("2026-05-22");
const date2 = moment("2026-05-23");

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

Преобразование в другие форматы

Moment.js позволяет конвертировать даты в разные типы:

  • .toDate() — объект JavaScript Date
  • .toISOString() — ISO 8601 строка
  • .unix() — метка времени в секундах
  • .valueOf() — метка времени в миллисекундах
const date = moment("2026-05-22");

console.log(date.toDate()); // Fri May 22 2026 00:00:00 GMT+0300
console.log(date.toISOString()); // 2026-05-21T21:00:00.000Z
console.log(date.unix()); // 1763737200
console.log(date.valueOf()); // 1763737200000

Цепочки методов

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

const formattedDate = moment()
  .add(3, "days")
  .startOf("day")
  .format("YYYY-MM-DD HH:mm:ss");

console.log(formattedDate); // 2026-05-25 00:00:00

Замечания по производительности

Moment.js хранит объект даты как мутабельный объект, поэтому методы изменяют исходный объект. Для работы с чистыми функциями рекомендуется создавать клоны с помощью clone(), чтобы избежать неожиданных изменений:

const original = moment("2026-05-22");
const copy = original.clone().add(1, "month");

console.log(original.format("YYYY-MM-DD")); // 2026-05-22
console.log(copy.format("YYYY-MM-DD")); // 2026-06-22

Итог

Moment.js предоставляет полный набор инструментов для работы с датами, включая создание, форматирование, манипуляции, локализацию, временные зоны и сравнение. Его основной принцип — объект moment, который инкапсулирует дату и время, обеспечивая удобные методы для любых операций с датами. Такой подход делает работу с датами в JavaScript значительно проще и безопаснее по сравнению с нативным объектом Date.