Валидация пользовательского ввода

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() — преобразование времени для корректной проверки ввода с часовыми поясами.

Резюме подходов к валидации

  1. Создание объекта Moment с явным указанием формата.
  2. Использование строгого режима для точной проверки соответствия формата.
  3. Сравнение с диапазонами и контроль границ.
  4. Форматирование и локализация для унификации данных.
  5. Обработка ошибок для безопасного дальнейшего использования.

Эти приёмы позволяют строить надёжную систему валидации пользовательских дат и времени, минимизируя риск ошибок и обеспечивая совместимость с различными сценариями ввода.