Globalize построен поверх CLDR (Unicode Common Locale Data Repository), поэтому работа с календарями в библиотеке опирается не на собственную модель дат, а на стандартизированные локализационные данные. Конвертация между календарями в этом контексте не является прямым преобразованием структуры даты в иной календарный алгоритм, а представляет собой интерпретацию одного и того же момента времени в разных календарных системах, определённых локалью.
CLDR определяет набор календарных систем, включая:
Каждая локаль может иметь календарь по умолчанию, а также альтернативные календарные представления. Globalize использует эти данные при форматировании дат, но не хранит собственные правила конвертации.
Ключевой принцип заключается в том, что момент времени остаётся неизменным (timestamp), а меняется лишь способ его отображения.
В основе работы лежит UNIX timestamp (миллисекунды с эпохи Unix). Любая дата, независимо от календаря, в конечном итоге сводится к этому числу:
Таким образом, конвертация календарей в Globalize — это не арифметическая операция, а отображение одного и того же timestamp через разные правила форматирования.
CLDR содержит:
Globalize извлекает эти данные через загрузку соответствующих JSON-файлов CLDR, например:
ca-gregorianca-islamicca-hebrewЭти файлы определяют, как календарь отображает дату, но не предоставляют самостоятельного механизма пересчёта даты между календарями.
Основной механизм работы — dateFormatter, который
использует опцию календаря через locale data.
Пример логики:
Внутренне используется:
Globalize.dateFormatter(options)При наличии локали, поддерживающей несколько календарей, форматирование может опираться на параметр календаря:
Результат зависит от выбранного набора CLDR-данных, загруженных в runtime.
Конвертация между календарями в Globalize реализуется через три шага:
Дата преобразуется в timestamp:
Выбирается календарь из CLDR:
Каждый календарь имеет собственные алгоритмы разложения timestamp на:
Форматирование производится с учётом:
Архитектура накладывает ряд ограничений:
convertCalendar(date, from, to)Фактически библиотека не выполняет трансформацию календарных систем, а лишь отображает один и тот же момент времени в разных системах координат.
CLDR хранит альтернативные календарные представления как отдельные наборы правил. Например:
ca-islamic-civil — гражданский исламский календарьca-islamic-umalqura — календарь Умм аль-КураGlobalize использует эти данные для генерации корректных компонентов даты при форматировании, включая:
CLDR основан на ICU (International Components for Unicode), где календарные системы унифицированы через общий интерфейс:
Globalize следует этой модели, не реализуя собственные календарные вычисления.
Некоторые календари используют концепцию эры:
При форматировании:
Конвертация календарей тесно связана с форматами:
shortmediumlongfullКаждый формат использует разные наборы CLDR-шаблонов, где календарная система влияет на:
Календарная система влияет не только на дату, но и на:
Globalize применяет numberingSystem из CLDR совместно с календарными правилами, что приводит к визуально различным представлениям одной и той же даты.
Каждая локаль в CLDR может задавать:
Globalize использует это при выборе дефолтных настроек форматирования, если календарь явно не указан.
Внутренняя модель можно представить как цепочку:
timestamp → CLDR calendar rules → date parts → locale formatting → строка вывода
При этом обратное преобразование (строка → календарь → timestamp) зависит от парсинга и не гарантирует уникальности в альтернативных календарях из-за различий в правилах интерпретации дат.
В календарях с лунной основой возможны неоднозначности:
Globalize избегает разрешения этих конфликтов, полагаясь на уже нормализованные CLDR данные.
С точки зрения архитектуры:
Такой подход обеспечивает согласованность между локалями, но исключает самостоятельную арифметическую конвертацию календарных систем внутри библиотеки.