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

Поведение парсинга по умолчанию

В стандартной конфигурации Day.js работает с ограниченным набором сценариев преобразования строк в дату. Базовый парсер опирается на встроенный механизм Date, который в JavaScript изначально ведёт себя достаточно гибко и допускает неоднозначные или частично некорректные строки.

import dayjs from 'dayjs';

dayjs('2026-01-01');
dayjs('2026/01/01');
dayjs('2026-1-1');

Во всех приведённых случаях результат будет интерпретирован как валидная дата, если строка поддаётся разбору встроенным парсером. Такой режим принято рассматривать как нестрогий, поскольку отсутствует жёсткое соответствие заранее заданному формату.

Особенность поведения заключается в том, что несоответствие формату не приводит к ошибке. Вместо этого происходит попытка «догадаться» о значении строки.


Нестрогий разбор как механизм гибкости

Нестрогий режим характеризуется следующими свойствами:

  • допускаются вариации разделителей (-, /, пробелы)
  • игнорируются лишние нули или их отсутствие
  • возможна интерпретация неполных или неоднозначных форматов
  • отсутствует контроль точного соответствия шаблону
dayjs('2026-1-1');
dayjs('2026-01-1');
dayjs('2026/1/01');

Все эти строки будут преобразованы в корректные даты, несмотря на различия в структуре.

Такой подход удобен при работе с пользовательским вводом, где данные часто поступают в разнородном виде. Однако он снижает предсказуемость обработки.


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

Основная проблема заключается в отсутствии гарантии соответствия формату. Например:

dayjs('2026-13-40');

Строка может быть частично нормализована, а результат окажется неожиданным. Встроенный парсер может «перенести» значения в следующий месяц или год, не сигнализируя об ошибке.

Дополнительно:

  • невозможно гарантировать структуру входных данных
  • ошибки формата маскируются преобразованием
  • тестирование становится менее надёжным

Строгий разбор с использованием customParseFormat

Строгий режим в Day.js реализуется через плагин customParseFormat.

import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';

dayjs.extend(customParseFormat);

После подключения появляется возможность задавать формат и режим строгой проверки.

dayjs('2026-01-01', 'YYYY-MM-DD', true);

Третий параметр true включает строгий режим.


Механика строгого режима

В строгом режиме строка должна полностью соответствовать заданному шаблону:

  • каждый символ проверяется на соответствие формату
  • структура должна быть идентичной шаблону
  • отклонения приводят к невалидному результату
dayjs('2026-1-1', 'YYYY-MM-DD', true);

Результат: невалидная дата.

dayjs('2026-01-01', 'YYYY-MM-DD', true);

Результат: валидная дата.


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

При строгом режиме Day.js не выбрасывает исключение. Вместо этого создаётся объект с состоянием «invalid».

const d = dayjs('2026-1-1', 'YYYY-MM-DD', true);

d.isValid(); // false

Метод isValid() становится ключевым инструментом проверки результата парсинга.


Сравнение строгого и нестрогого подходов

Характеристика Нестрогий режим Строгий режим
Проверка формата отсутствует обязательная
Гибкость ввода высокая низкая
Надёжность данных средняя высокая
Обработка ошибок скрытая явная (invalid)
Использование шаблонов не требуется обязательно

Значение формата в строгом режиме

При строгом разборе формат становится частью логики валидации, а не только интерпретации.

dayjs('01-02-2026', 'DD-MM-YYYY', true);

Здесь важен порядок:

  • DD — день
  • MM — месяц
  • YYYY — год

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


Типичные сценарии использования строгого режима

Строгий режим применяется в ситуациях, где требуется предсказуемость данных:

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

В таких сценариях недопустима неоднозначная интерпретация дат.


Работа с несколькими форматами

При необходимости допуска нескольких форматов строгий режим может комбинироваться с массивом шаблонов.

dayjs('2026-01-01', ['YYYY-MM-DD', 'YYYY/MM/DD'], true);

Строка должна соответствовать одному из форматов полностью. Частичное совпадение не допускается.


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

После любого строгого или нестрогого парсинга результат требует проверки состояния.

const date = dayjs('2026-01-01', 'YYYY-MM-DD', true);

if (date.isValid()) {
  // использование даты
}

Метод isValid() опирается на внутреннее состояние объекта и отражает успешность разбора.


Особенности интерпретации некорректных значений

Некорректные даты в строгом режиме не приводят к аварийному завершению выполнения. Вместо этого:

  • объект создаётся
  • внутреннее состояние помечается как invalid
  • операции над датой становятся недоступными или возвращают NaN-подобные значения
const d = dayjs('invalid', 'YYYY-MM-DD', true);

d.format(); // "Invalid Date"
d.isValid(); // false

Роль строгого режима в архитектуре приложений

Использование строгого режима влияет на общую предсказуемость системы обработки времени. Он уменьшает количество скрытых ошибок, возникающих из-за автоматической интерпретации строк, и переносит контроль формата на уровень входных данных.

В нестрогом режиме логика интерпретации распределяется между разработчиком и библиотекой. В строгом режиме ответственность полностью фиксируется через шаблон парсинга.