Moment.js — это библиотека для работы с датами и временем в
JavaScript, предоставляющая удобный и унифицированный API для парсинга,
форматирования, вычислений и манипуляций с временными данными. Основным
объектом является moment, который создается с помощью
вызова функции moment(). Он инкапсулирует дату и время и
предоставляет методы для выполнения операций с ними.
const now = moment();
console.log(now.format()); // выводит текущую дату и время в ISO 8601
При создании объекта можно использовать различные источники данных:
"YYYY-MM-DD",
"MM/DD/YYYY" и т.д.).Date.[год, месяц, день, часы, минуты, секунды].const dateFromString = moment("2026-05-22", "YYYY-MM-DD");
const dateFromArray = moment([2026, 4, 22]); // месяцы считаются с 0
Moment.js позволяет легко преобразовывать объекты даты в строки различного формата. Ключевым методом является format():
moment().format("YYYY-MM-DD HH:mm:ss"); // 2026-05-22 14:30:00
moment().format("dddd, MMMM Do YYYY"); // пятница, Май 22-й 2026
Поддержка локалей реализована через метод locale():
moment().locale('ru').format('LLLL'); // пятница, 22 мая 2026 г., 14:30
Moment.js предоставляет удобные методы для изменения даты:
moment().add(7, 'days'); // через 7 дней
moment().subtract(3, 'months'); // 3 месяца назад
moment().startOf('month'); // начало текущего месяца
moment().endOf('year'); // конец текущего года
Поддерживаются единицы измерения: years,
months, weeks, days,
hours, minutes, seconds,
milliseconds.
Сравнение осуществляется через методы isBefore, isAfter, isSame, а также через разницу через diff:
const date1 = moment("2026-05-22");
const date2 = moment("2026-06-01");
date1.isBefore(date2); // true
date1.isAfter(date2); // false
date1.diff(date2, 'days'); // -10
Метод diff позволяет вычислять разницу в любых
единицах времени, включая years, months,
days, hours, minutes,
seconds.
Базовая версия Moment.js не поддерживает временные зоны напрямую, но можно использовать Moment Timezone:
const nyTime = moment.tz("2026-05-22 14:30", "America/New_York");
nyTime.format(); // дата и время в часовом поясе Нью-Йорка
Возможности библиотеки Moment Timezone включают конвертацию между зонами, определение смещения и работу с правилами перехода на летнее/зимнее время.
Парсинг строк может быть как нестрогим, так и строгим. Нестрогий парсинг может распознать множество форматов, но иногда приводит к ошибкам. Строгий парсинг активируется через третий аргумент strict:
moment("2026-05-22", "YYYY-MM-DD", true).isValid(); // true
moment("22-05-2026", "YYYY-MM-DD", true).isValid(); // false
Метод isValid() позволяет проверять корректность созданного объекта moment, предотвращая некорректные даты.
При миграции на современные API (Temporal,
date-fns или нативный Intl.DateTimeFormat)
важно минимизировать риски и постепенность перехода. Существует
несколько подходов:
Постепенная замена форматов На первом этапе
можно использовать Moment.js для парсинга и форматирования, но при этом
постепенно переводить форматы в нативные объекты Date или
Temporal.PlainDateTime.
const momentDate = moment("2026-05-22");
const nativeDate = momentDate.toDate(); // преобразование в DateИнкапсуляция через адаптеры Создается
слой-обертка (adapter), который скрывает Moment.js внутри проекта. Это
позволяет заменить внутреннюю реализацию на date-fns или
Temporal без изменения остального кода.
function parseDate(value) {
return moment(value); // позже заменяется на Temporal
}
function formatDate(date) {
return date.format("YYYY-MM-DD"); // позже заменяется на date.toString()
}Локальная миграция модулей Миграция выполняется по модульному принципу: отдельные компоненты переводятся на новый API, а остальные продолжают использовать Moment.js. Таким образом, можно тестировать и оптимизировать каждый модуль по отдельности.
Временные проверки и валидация На этапе миграции
важно использовать строгую проверку (strict mode) и
валидацию через isValid(), чтобы убедиться, что новые
форматы и объекты корректны.
Параллельное использование Наиболее безопасный путь — параллельное использование Moment.js и нового API. Новые функции реализуются на современном подходе, а старые функции продолжают работать с Moment.js до полной миграции.
С Moment.js:
const m = moment("2026-05-22 14:30", "YYYY-MM-DD HH:mm");
console.log(m.add(1, 'day').format("YYYY-MM-DD HH:mm"));
На Temporal API:
const dt = Temporal.PlainDateTime.from("2026-05-22T14:30");
const newDt = dt.add({ days: 1 });
console.log(newDt.toString()); // "2026-05-23T14:30"
Пошаговая миграция позволяет сократить технический долг, сохраняет стабильность приложения и предоставляет гибкость в выборе нового современного API для работы с датами.