В стандартном режиме разбор строк дат в 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");
Результат:
Такое поведение удобно, но может приводить к скрытым ошибкам в данных.
При включении строгого режима любые отклонения приводят к невалидной дате:
moment("2026-01-40", "YYYY-MM-DD", true).isValid();
// false
Ключевые правила строгого режима:
moment("2026-05-21", "YYYY-MM-DD", true).isValid();
// true
Строка полностью совпадает с шаблоном:
YYYY → 2026MM → 05DD → 21moment("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
Строгий режим часто применяется вместе с проверкой:
const m = moment("2026-02-30", "YYYY-MM-DD", true);
m.isValid(); // false
Особенности:
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 строгий режим используется в сценариях:
Основная цель — исключить неоднозначность интерпретации даты и обеспечить детерминированное поведение при любых входных данных.