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

В библиотеке js-joda поведение парсинга строковых представлений дат и времени определяется механизмом разрешения значений (resolver style), который во многом повторяет подход java.time. Строгий режим (STRICT) предполагает максимально жёсткую проверку входных данных: строка должна полностью соответствовать формату, правилам календаря и допустимым диапазонам значений.

Ключевая особенность строгого режима заключается в том, что он рассматривает вход не как «приблизительное описание даты», а как точное значение, которое должно быть математически и календарно корректным.

Основные характеристики строгого режима:

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

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

Календарная валидность в строгом режиме

Строгий режим учитывает реальную структуру календаря. Например, дата 31 февраля будет отклонена, даже если формат строки корректен.

Также проверяются:

  • количество дней в месяце
  • високосные годы
  • допустимые значения часов (0–23)
  • допустимые значения минут и секунд (0–59)

Ошибка возникает не из-за формата, а из-за невозможности существования такой даты.

Нестрогий режим разбора

Нестрогий режим (LENIENT) ориентирован на гибкость. Он допускает преобразование входных данных и попытки интерпретации значений, выходящих за стандартные границы.

Главная идея заключается в том, что парсер не должен падать при незначительных отклонениях, а должен попытаться привести данные к валидной дате или времени.

Особенности нестрогого режима:

  • автоматическая нормализация значений
  • перенос переполнений (overflow) в старшие единицы времени
  • допустимость нестандартных диапазонов
  • интерпретация «неидеальных» дат

Пример поведения: если указано «2024-02-30», система может интерпретировать это как 1 марта 2024 года, добавив недостающие дни.

Нормализация значений

Нестрогий режим активно использует перераспределение значений между компонентами даты и времени:

  • 75 минут → 1 час 15 минут
  • 90 секунд → 1 минута 30 секунд
  • 13 месяцев → переход в следующий год

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

Режимы разрешения значений (ResolverStyle)

В js-joda режим строгости реализуется через ResolverStyle, который может принимать три значения:

  • STRICT — строгая проверка без отклонений
  • SMART — промежуточный режим с частичной коррекцией
  • LENIENT — максимально гибкий разбор

SMART режим часто рассматривается как компромисс: он допускает некоторые логические исправления, но не столь радикален, как LENIENT.

Отличие SMART от LENIENT

SMART режим:

  • корректирует только очевидные ошибки
  • сохраняет календарную логическую целостность
  • не допускает сильных переполнений

LENIENT режим:

  • разрешает арифметическое «разворачивание» значений
  • полностью перераспределяет компоненты даты и времени
  • фактически интерпретирует вход как числовую последовательность

Поведение DateTimeFormatter при парсинге

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

Форматтер может быть настроен следующим образом:

  • без явного указания — используется стандартный строгий режим
  • с указанием withResolverStyle(...) — применяется выбранная стратегия

Разбор строки проходит в несколько этапов:

  1. разбиение строки согласно шаблону
  2. извлечение полей (год, месяц, день и т.д.)
  3. применение правил resolver style
  4. финальная валидация результата

Именно на этапе (3) определяется, будет ли значение принято или отклонено.

Строгий режим и пользовательский ввод

Строгий режим особенно важен в системах, где критична точность данных:

  • финансовые операции
  • расписания и бронирования
  • события с фиксированными датами
  • логирование и аудит

Любая неточность в таких системах может привести к некорректной интерпретации событий.

Например, строка 2024-04-31 всегда будет отклонена, так как апрель содержит 30 дней. Даже если формат соответствует шаблону YYYY-MM-DD, календарная ошибка делает значение недопустимым.

Нестрогий режим и обработка «грязных» данных

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

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

В таких условиях важнее сохранить интерпретируемость данных, чем строгое соответствие календарю.

Например:

  • «2024-00-10» может быть интерпретировано как декабрь 2023 + 10 дней
  • «2024-13-01» как январь 2025
  • «25:90:00» как следующий день с нормализованным временем

Влияние режима на сложные форматы

При работе с составными форматами (дата + время + зона) различия режимов становятся более заметными.

В строгом режиме:

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

В нестрогом режиме:

  • возможна корректировка смещений
  • допускается перерасчёт времени относительно UTC
  • неоднозначные зоны могут быть интерпретированы по умолчанию

Ошибки парсинга в строгом режиме

Типичные причины ошибок:

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

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

Сравнительное поведение режимов

При одинаковой входной строке результат может существенно отличаться:

  • строгий режим: ошибка парсинга
  • SMART: частичная коррекция с сохранением смысла
  • LENIENT: полная нормализация и преобразование

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

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

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

  • высокую предсказуемость результата
  • минимальное количество скрытых преобразований
  • упрощённую диагностику ошибок

Нестрогий режим:

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

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