В библиотеке js-joda поведение парсинга строковых
представлений дат и времени определяется механизмом разрешения
значений (resolver style), который во многом повторяет подход
java.time. Строгий режим (STRICT) предполагает максимально
жёсткую проверку входных данных: строка должна полностью соответствовать
формату, правилам календаря и допустимым диапазонам значений.
Ключевая особенность строгого режима заключается в том, что он рассматривает вход не как «приблизительное описание даты», а как точное значение, которое должно быть математически и календарно корректным.
Основные характеристики строгого режима:
DateTimeFormatterПри строгом разборе библиотека не пытается «догадаться», что имелось в виду. Любое отклонение приводит к ошибке парсинга.
Строгий режим учитывает реальную структуру календаря. Например, дата 31 февраля будет отклонена, даже если формат строки корректен.
Также проверяются:
Ошибка возникает не из-за формата, а из-за невозможности существования такой даты.
Нестрогий режим (LENIENT) ориентирован на гибкость. Он допускает преобразование входных данных и попытки интерпретации значений, выходящих за стандартные границы.
Главная идея заключается в том, что парсер не должен падать при незначительных отклонениях, а должен попытаться привести данные к валидной дате или времени.
Особенности нестрогого режима:
Пример поведения: если указано «2024-02-30», система может интерпретировать это как 1 марта 2024 года, добавив недостающие дни.
Нестрогий режим активно использует перераспределение значений между компонентами даты и времени:
Такой подход полезен при обработке пользовательского ввода, где данные часто выходят за пределы формальных ограничений.
В js-joda режим строгости реализуется через
ResolverStyle, который может принимать три значения:
SMART режим часто рассматривается как компромисс: он допускает некоторые логические исправления, но не столь радикален, как LENIENT.
SMART режим:
LENIENT режим:
При использовании DateTimeFormatter режим строгости
задаётся через конфигурацию форматтера.
Форматтер может быть настроен следующим образом:
withResolverStyle(...) — применяется
выбранная стратегияРазбор строки проходит в несколько этапов:
Именно на этапе (3) определяется, будет ли значение принято или отклонено.
Строгий режим особенно важен в системах, где критична точность данных:
Любая неточность в таких системах может привести к некорректной интерпретации событий.
Например, строка 2024-04-31 всегда будет отклонена, так
как апрель содержит 30 дней. Даже если формат соответствует шаблону
YYYY-MM-DD, календарная ошибка делает значение
недопустимым.
Нестрогий режим применяется в ситуациях, где данные приходят из ненадёжных источников:
В таких условиях важнее сохранить интерпретируемость данных, чем строгое соответствие календарю.
Например:
При работе с составными форматами (дата + время + зона) различия режимов становятся более заметными.
В строгом режиме:
В нестрогом режиме:
Типичные причины ошибок:
В строгом режиме такие ошибки не исправляются автоматически, а приводят к исключению при разборе строки.
При одинаковой входной строке результат может существенно отличаться:
Это делает выбор режима ключевым архитектурным решением при проектировании системы работы с датами.
Строгий режим обеспечивает:
Нестрогий режим:
Выбор между режимами напрямую связан с балансом между надёжностью и гибкостью обработки данных.