Строгий режим парсинга

В стандартном режиме разбор строк дат в Moment.js допускает гибкое сопоставление форматов: библиотека пытается интерпретировать входные данные даже при частичном несоответствии шаблону. Это поведение повышает устойчивость к «грязным» данным, но снижает предсказуемость. Строгий режим парсинга устраняет эту неопределённость, заставляя движок проверять соответствие строки формату символ-в-символ.


Базовый принцип строгого парсинга

Строгий режим включается при передаче третьего параметра true в функцию создания даты:

moment(input, format, strict)

или при использовании массива форматов:

moment(input, [formats], strict)

Где:

  • input — строка даты
  • format — строка или массив шаблонов
  • strict — булев флаг строгого режима

При значении strict = true парсер:

  • требует полного соответствия формату
  • запрещает «догадки» при разборе
  • отклоняет некорректные или частично совпадающие строки

Поведение без строгого режима

Без включённого строгого режима Moment.js допускает вариативность:

moment("2026-01-40", "YYYY-MM-DD");

Результат:

  • библиотека может «исправить» дату
  • происходит нормализация переполнений (например, 40 января → февраль)

Такое поведение удобно, но может приводить к скрытым ошибкам в данных.


Поведение в строгом режиме

При включении строгого режима любые отклонения приводят к невалидной дате:

moment("2026-01-40", "YYYY-MM-DD", true).isValid(); 
// false

Ключевые правила строгого режима:

  • каждый символ входной строки должен соответствовать токену формата
  • запрещены дополнительные или отсутствующие символы
  • значения должны укладываться в допустимые диапазоны (день, месяц, час и т.д.)
  • отсутствует автоматическая коррекция

Примеры строгого парсинга

Полное соответствие формату

moment("2026-05-21", "YYYY-MM-DD", true).isValid();
// true

Строка полностью совпадает с шаблоном:

  • YYYY → 2026
  • MM → 05
  • DD → 21

Несоответствие длины или структуры

moment("2026-5-21", "YYYY-MM-DD", true).isValid();
// false

Причина:

  • месяц должен быть с ведущим нулём (05, а не 5)

Лишние символы

moment("2026-05-21 extra", "YYYY-MM-DD", true).isValid();
// false

Причина:

  • формат не допускает дополнительных данных

Частичное совпадение

moment("21-05-2026", "YYYY-MM-DD", true).isValid();
// false

Причина:

  • порядок элементов не соответствует формату

Отличие строгого и нестрогого режима

Поведение Нестрогий режим Строгий режим
Исправление дат да нет
Допустимы лишние символы иногда нет
Проверка формата частичная полная
Предсказуемость ниже выше

Moment.js использует строгий режим как механизм детерминированной валидации входных данных.


Работа с массивом форматов в строгом режиме

Строгий режим особенно важен при использовании нескольких возможных форматов:

moment("21/05/2026", ["YYYY-MM-DD", "DD/MM/YYYY"], true).isValid();
// true

Логика:

  • проверяется каждый формат по очереди
  • совпадение должно быть точным
  • первый подходящий формат принимает строку

Если ни один формат не совпадает строго:

moment("2026/21/05", ["YYYY-MM-DD", "DD/MM/YYYY"], true).isValid();
// false

Валидация с использованием isValid()

Строгий режим часто применяется вместе с проверкой:

const m = moment("2026-02-30", "YYYY-MM-DD", true);

m.isValid(); // false

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

  • проверяется не только формат, но и календарная корректность
  • несуществующие даты отклоняются
  • февраль 30 всегда считается ошибкой

Строгий режим и ISO-строки

ISO 8601 формат может выглядеть корректно даже без строгого режима:

moment("2026-05-21T10:30:00").isValid(); // true

Однако строгий режим усиливает контроль:

moment("2026-05-21 10:30:00", "YYYY-MM-DDTHH:mm:ss", true).isValid();
// false

Причина:

  • пробел вместо T нарушает спецификацию формата

Токены формата и их влияние на строгость

В Moment.js строгий режим опирается на систему токенов:

  • YYYY — четырёхзначный год
  • MM — месяц с ведущим нулём
  • DD — день месяца
  • HH — часы (24-часовой формат)
  • mm — минуты
  • ss — секунды

Любое отклонение от структуры токена делает строку невалидной.

Пример:

moment("2026-5-01", "YYYY-MM-DD", true).isValid();
// false (месяц не двухзначный)

Влияние локали на строгий парсинг

Локализация влияет только на текстовые элементы (названия месяцев, дней недели), но в строгом режиме требования усиливаются:

moment("21 May 2026", "DD MMM YYYY", true).isValid();
// зависит от активной локали

Если локаль не соответствует входной строке:

  • парсинг отклоняется
  • результат становится невалидным

Частые ошибки при использовании строгого режима

Несовпадение формата и данных

moment("2026-13-01", "YYYY-MM-DD", true).isValid();
// false

Игнорирование ведущих нулей

moment("2026-05-2", "YYYY-MM-DD", true).isValid();
// false

Перепутанный порядок элементов

moment("05-21-2026", "YYYY-MM-DD", true).isValid();
// false

Поведение при невалидном результате

Если строгий парсинг не проходит:

  • объект moment создаётся, но помечается как невалидный
  • методы форматирования возвращают "Invalid date"
const m = moment("invalid", "YYYY-MM-DD", true);

m.format(); // "Invalid date"
m.isValid(); // false

Практическая значимость строгого режима

Внутри экосистемы Moment.js строгий режим используется в сценариях:

  • валидация пользовательского ввода
  • проверка API-данных
  • парсинг логов
  • обработка финансовых и временных меток
  • предотвращение неявных преобразований

Основная цель — исключить неоднозначность интерпретации даты и обеспечить детерминированное поведение при любых входных данных.