Moment.js предоставляет удобный и мощный API для работы с датами и временем в JavaScript. Он позволяет создавать, форматировать, сравнивать, изменять и валидировать даты, обеспечивая совместимость с различными форматами и локалями.
Создание объекта Moment может происходить несколькими способами:
// Текущая дата и время
const now = moment();
// Дата из строки
const dateFromString = moment("2026-05-22", "YYYY-MM-DD");
// Дата из отдельных компонентов
const dateFromComponents = moment({ year: 2026, month: 4, day: 22 });
// Дата из timestamp
const dateFromTimestamp = moment(1684761600000);
Все объекты Moment являются мутируемыми, что означает, что операции изменения даты модифицируют существующий объект, если не использовать методы клонирования.
Валидация пользовательского ввода — ключевой этап обработки данных, связанный с датами. Moment.js предоставляет несколько инструментов для проверки корректности введённых значений.
Метод .isValid() проверяет, корректна ли дата:
const validDate = moment("2026-05-22", "YYYY-MM-DD");
console.log(validDate.isValid()); // true
const invalidDate = moment("2026-02-30", "YYYY-MM-DD");
console.log(invalidDate.isValid()); // false
Важно понимать, что формат строки и указание формата имеют критическое значение. Если формат не указан, Moment попытается распознать строку автоматически, что может привести к неожиданным результатам.
Для повышения надёжности используется строгая проверка формата:
const strictDate = moment("22-05-2026", "YYYY-MM-DD", true);
console.log(strictDate.isValid()); // false, потому что формат не соответствует
Ключевые моменты строгого режима:
moment() — булевый параметр
strict.Moment.js позволяет проверять даты относительно других дат или диапазонов.
const startDate = moment("2026-01-01");
const endDate = moment("2026-12-31");
const userDate = moment("2026-06-15");
const isInRange = userDate.isBetween(startDate, endDate, undefined, '[]');
// '[]' означает включительно
console.log(isInRange); // true
Методы для сравнений:
.isBefore() — проверяет, находится ли дата раньше
другой даты..isAfter() — проверяет, находится ли дата позже другой
даты..isSame() — проверяет совпадение дат, можно указать
точность ('day', 'month',
'year').Для валидации полезно привести данные к единому формату перед проверкой.
const rawInput = "22/05/2026";
const formattedDate = moment(rawInput, "DD/MM/YYYY", true);
if (formattedDate.isValid()) {
console.log(formattedDate.format("YYYY-MM-DD")); // 2026-05-22
} else {
console.log("Некорректная дата");
}
Особенности форматирования:
YYYY — год,
MM — месяц, DD — день.HH:mm:ss.Moment.js поддерживает локализацию, что важно при вводе дат в различных форматах.
moment.locale('ru'); // Устанавливаем русскую локаль
const ruDate = moment("22 мая 2026", "D MMMM YYYY", true);
console.log(ruDate.isValid()); // true
Локализация позволяет:
Лучшей практикой является явная проверка даты перед использованием:
const inputDate = moment(userInput, "YYYY-MM-DD", true);
if (!inputDate.isValid()) {
throw new Error("Введена некорректная дата");
}
// Дальнейшая обработка безопасна
Такой подход предотвращает ошибки при вычислениях, форматировании и сохранении данных.
.isLeapYear() — проверка, является ли год
високосным..isDST() — проверка, находится ли дата в периоде
летнего времени..utc() и .local() — преобразование времени
для корректной проверки ввода с часовыми поясами.Эти приёмы позволяют строить надёжную систему валидации пользовательских дат и времени, минимизируя риск ошибок и обеспечивая совместимость с различными сценариями ввода.