Библиотека построена вокруг отказа от скрытых контекстов, которые в традиционных реализациях работы с датой и временем приводят к непредсказуемому поведению. Любая операция здесь опирается на явно заданные параметры: временная зона, локаль, правила разбора и форматирования, источник текущего времени. Такой подход устраняет зависимость от окружения выполнения и делает поведение кода воспроизводимым при переносе между средами.
Основная идея заключается в том, что дата и время не должны «догонять» систему автоматически. Ни системная временная зона, ни локальные настройки операционной системы, ни глобальные настройки форматов не должны влиять на результат без явного указания. Любая неявность рассматривается как источник потенциальной ошибки.
В стандартных реализациях работы со временем часто присутствует глобальная временная зона, глобальная локаль и глобальные настройки парсинга. В таких условиях один и тот же код может давать разные результаты в зависимости от сервера, контейнера или браузера.
В js-joda эта модель заменяется на управляемую конфигурацию через явные объекты и параметры:
ZoneIdLocaleClockResolverStyleГлобальные значения существуют, но их роль ограничена значениями по умолчанию, которые можно переопределить. Даже эти значения не используются неявно внутри вычислений, если они не были явно запрошены.
Временная зона является одним из ключевых источников неоднозначности в работе с датами. В js-joda любая операция, связанная с календарным временем, требует чёткого указания зоны, если она потенциально может влиять на результат.
Объект ZoneId не подменяется системной зоной
автоматически. Например, создание зонального времени всегда опирается на
явное указание:
Такой подход исключает ситуацию, когда код, написанный на одной машине, начинает вести себя иначе после переноса на другую.
Локаль влияет на разбор и форматирование строковых представлений даты
и времени. В js-joda локаль не является частью глобального состояния.
Она передаётся через DateTimeFormatter или через настройки,
явно применяемые к форматтеру.
Это означает:
Локаль рассматривается как параметр бизнес-логики, а не как часть инфраструктуры.
При разборе строковых дат возникает проблема неоднозначных или
частично некорректных значений. В js-joda эта проблема решается через
ResolverStyle, который определяет строгость интерпретации
входных данных.
Используются три режима:
Ключевой принцип заключается в том, что поведение парсинга не скрыто внутри библиотеки, а выбирается явно в момент создания форматтера. Это исключает ситуации, когда формат строки «случайно» интерпретируется иначе в другой версии среды.
Форматирование и разбор строк строится вокруг
DateTimeFormatter, который является полностью
конфигурируемым объектом. Он не использует скрытые настройки
окружения.
Конфигурация форматтера включает:
ResolverStyle)Каждый из этих параметров задаётся явно, и результат работы форматтера полностью определяется ими.
Такой подход делает форматирование детерминированным: одна и та же конфигурация всегда даёт один и тот же результат независимо от окружения.
Вместо прямого обращения к системному времени используется абстракция
Clock. Это позволяет отделить получение текущего времени от
логики его использования.
С точки зрения конфигурирования это означает:
Clock становится частью конфигурации системы, а не
скрытым сервисом.
Несмотря на общий отказ от глобального состояния, библиотека
допускает ограниченный набор глобальных настроек через объект
Settings. Он используется только для параметров, которые
должны иметь дефолтное значение, но при этом остаются
переопределяемыми.
К таким настройкам относятся:
Однако даже эти настройки не приводят к неявному поведению внутри вычислений. Они применяются только в тех местах, где явно разрешено использование значений по умолчанию.
Вся архитектура конфигурирования сводится к тому, что контекст не хранится скрыто, а передаётся через параметры объектов и методов.
Это приводит к нескольким следствиям:
Контекст становится частью данных, а не частью среды выполнения.
Явное конфигурирование напрямую связано с изоляцией вычислений. Каждая операция работает в рамках строго определённого набора входных параметров. Это исключает влияние внешних факторов, таких как:
Поведение системы становится математически воспроизводимым при одинаковых входных данных.
Особое значение имеет отказ от автоматических преобразований. Например:
Любая трансформация требует явного указания механизма, который её выполняет.
Такой подход устраняет класс ошибок, связанных с «магическим» поведением библиотек, где результат зависит от неочевидных факторов.
В рамках js-joda конфигурация рассматривается как часть модели системы. Она не отделена от данных, а существует рядом с ними.
Это выражается в том, что:
В результате система становится композиционной: поведение строится через сборку объектов, а не через настройку глобальной среды.
Явное конфигурирование особенно критично в распределённых системах, где код выполняется в разных окружениях. При отсутствии скрытых зависимостей поведение остаётся стабильным при:
Одинаковая конфигурация гарантирует одинаковый результат независимо от среды выполнения.
Одним из ключевых следствий подхода становится строгое разделение между самими данными и правилами их интерпретации. Дата и время представляют собой значение, тогда как зона, локаль и формат — это способ интерпретации этого значения.
Такое разделение устраняет смешивание уровней абстракции и делает поведение системы более прозрачным: данные остаются неизменными, а интерпретация определяется контекстом, который явно передан в операцию.