Проверка валидности

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


Метод moment().isValid()

Описание: метод isValid() позволяет определить, является ли объект Moment корректной датой. Он возвращает булево значение true или false.

Синтаксис:

moment(input).isValid()
  • input — строка, число, объект Date, массив или объект Moment, который требуется проверить.

Примеры использования:

moment("2023-05-21").isValid(); // true
moment("2023-13-01").isValid(); // false, неверный месяц
moment("invalid-date").isValid(); // false
moment(new Date()).isValid(); // true

Особенности:

  • Метод корректно обрабатывает ISO 8601 строки.
  • Проверка учитывает количество дней в месяце, корректность месяца и года, а также допустимость времени (часы, минуты, секунды).

Проверка при использовании форматов

Moment.js позволяет передавать строку вместе с форматом. В этом случае проверка учитывает соответствие именно заданному формату.

Синтаксис:

moment(input, format, strict).isValid()
  • input — строка с датой.
  • format — строка формата, например "YYYY-MM-DD".
  • strict (необязательный) — булево значение, указывающее, использовать строгую проверку соответствия формату.

Примеры:

moment("21-05-2023", "DD-MM-YYYY").isValid(); // true
moment("21/05/2023", "DD-MM-YYYY").isValid(); // true (нестрогое)
moment("21/05/2023", "DD-MM-YYYY", true).isValid(); // false (строгая проверка)

Примечание: строгий режим (strict = true) особенно полезен при парсинге данных из внешних источников, чтобы исключить ошибки из-за неверного формата.


Валидация отдельных компонентов даты

Иногда необходимо проверить корректность только отдельных частей даты — года, месяца или дня. Для этого Moment.js предоставляет вспомогательные функции, хотя прямого метода для отдельных компонентов нет. Однако можно создавать Moment и проверять его валидность.

let date = moment({ year: 2023, month: 4, day: 32 });
date.isValid(); // false, так как в мае нет 32 дней
  • year — полный год (например, 2023).
  • month — индекс месяца (0 — январь, 11 — декабрь).
  • day — число месяца.

Это позволяет строить гибкие проверки при генерации дат программно.


Валидация с учётом локали

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

moment("21 мая 2023", "D MMMM YYYY", "ru").isValid(); // true
moment("21 May 2023", "D MMMM YYYY", "ru").isValid(); // false
  • В строгом режиме локаль имеет критическое значение, так как месяц должен соответствовать языковой локали.

Специальные случаи и граничные значения

  1. Пустые строки и null:
moment("").isValid(); // false
moment(null).isValid(); // false
  1. Объекты Date с некорректным значением:
moment(new Date("invalid")).isValid(); // false
  1. Числовые значения:
  • Timestamp в миллисекундах проверяется корректно:
moment(1684665600000).isValid(); // true
  • Timestamp вне диапазона допустимых значений Moment:
moment(9999999999999999).isValid(); // false

Комбинированная валидация с проверкой формата и диапазона

Для приложений, где важно проверить не только корректность даты, но и её принадлежность к определённому диапазону, можно комбинировать методы isValid() и сравнение дат:

let date = moment("2023-05-21", "YYYY-MM-DD", true);
if (date.isValid() && date.isBetween("2023-01-01", "2023-12-31")) {
    console.log("Дата корректна и в пределах 2023 года");
}
  • Метод isBetween возвращает true, если дата лежит между указанными границами (по умолчанию границы не включаются, но можно передавать флаги для включения).

Советы по безопасной валидации

  • Всегда использовать строгий режим при работе с внешними строковыми данными.
  • Проверять объекты Date перед созданием Moment для исключения некорректных значений.
  • При локализованных данных указывать правильную локаль.
  • Для динамически создаваемых дат проверять диапазоны значений месяцев и дней.

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