Календарные системы

Архитектура календарных данных

В основе календарной поддержки Globalize лежит модель данных CLDR (Unicode Common Locale Data Repository). Календарные системы в этой модели рассматриваются как набор правил:

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

Globalize не реализует календарные алгоритмы самостоятельно. Он выступает как слой форматирования и парсинга, полностью опирающийся на структурированные данные CLDR.

Ключевая особенность подхода заключается в разделении:

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

Globalize работает исключительно с представлением.


Григорианский календарь как базовая система

На практике основой большинства локалей является григорианский календарь. Он используется как стандартный календарь в большинстве языков и регионов.

CLDR описывает его через:

  • порядковые номера месяцев
  • сокращённые и полные названия месяцев
  • названия дней недели
  • форматы даты (short, medium, long, full)

Globalize использует эти данные при форматировании:

const Globalize = require("globalize");

const en = new Globalize("en");
const formatter = en.dateFormatter({ date: "medium" });

formatter(new Date(2026, 0, 24));

Результат зависит от локали, но структура формата определяется CLDR.


Форматы дат и их уровни

CLDR определяет четыре базовых уровня форматирования:

  • short — компактное представление
  • medium — баланс читаемости и краткости
  • long — полное текстовое отображение месяца
  • full — максимально подробное представление

Globalize использует эти уровни как стандартные шаблоны:

const formatterShort = en.dateFormatter({ date: "short" });
const formatterFull = en.dateFormatter({ date: "full" });

Разница между уровнями заключается не только в длине строки, но и в семантической насыщенности. Например, в некоторых локалях full-формат может включать день недели.


Эры и системы летоисчисления

CLDR поддерживает несколько систем летоисчисления, где ключевым элементом выступает эра. Это особенно важно для языков и регионов, использующих альтернативные календарные системы:

  • японский календарь (era-based)
  • буддийский календарь
  • исламский календарь
  • еврейский календарь

Каждая система описывает:

  • список эр
  • правила смены эры
  • локализованные названия эр
  • формат отображения года относительно эры

Пример концептуального представления:

const ja = new Globalize("ja-JP");

const formatter = ja.dateFormatter({
  date: "long",
  calendar: "japanese"
});

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

  • Reiwa 6
  • Heisei 30

Эта трансформация полностью определяется данными CLDR.


Множественные календарные системы в CLDR

CLDR поддерживает несколько календарей параллельно. Основные из них:

  • gregory (григорианский)
  • buddhist (буддийский)
  • japanese (японский императорский)
  • islamic (исламский)
  • hebrew (еврейский)
  • chinese (традиционный лунно-солнечный)

Каждый календарь имеет собственные правила вычисления года и структуры месяцев.

Globalize получает эти данные через CLDR и использует их при форматировании дат, если календарь указан или если локаль подразумевает альтернативную систему.


Локализация календаря и выбор системы

Выбор календарной системы определяется комбинацией факторов:

  • локаль пользователя
  • настройки региона
  • тип календаря в CLDR
  • явные параметры форматирования

В некоторых локалях календарь неявно отличается от григорианского. Например:

  • в Японии используется григорианский календарь с эрами
  • в Таиланде используется буддийская эра как стандарт
  • в арабских странах может применяться исламский календарь в религиозных контекстах

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


Структура календарных данных CLDR

CLDR описывает календарь через несколько ключевых блоков:

  • months — названия месяцев
  • days — дни недели
  • eras — список эр
  • dateFormats — шаблоны отображения
  • timeFormats — форматы времени
  • dateTimeFormats — комбинированные форматы

Эти данные представлены в виде JSON-структур и загружаются в Globalize перед использованием.


Работа с форматированием дат

Форматирование даты в Globalize происходит через фабрику форматтеров:

const formatter = en.dateFormatter({
  date: "long"
});

formatter(new Date());

Внутренне происходит:

  1. выбор локали
  2. загрузка соответствующего календаря из CLDR
  3. применение шаблона форматирования
  4. подстановка локализованных названий

Парсинг дат и календарные правила

Помимо форматирования, Globalize поддерживает обратную операцию — парсинг строк в даты.

Парсинг зависит от календарной системы:

  • порядок компонентов даты
  • разделители
  • локальные названия месяцев
  • числовые форматы
const parser = en.dateParser({ date: "short" });

parser("01/24/26");

При этом корректность интерпретации зависит от совпадения формата строки и локали.


Относительные даты и календарный контекст

CLDR включает данные для относительных временных выражений:

  • сегодня
  • вчера
  • завтра
  • через N дней
  • N дней назад

Globalize использует эти данные для генерации локализованных строк:

const relative = en.relativeTimeFormatter("day");

relative(-1); // yesterday
relative(1);  // tomorrow

Хотя это не календарная система в строгом смысле, логически она является частью календарного представления времени.


Особенности японской календарной модели

Японский календарь представляет особый случай, так как объединяет григорианскую систему с эрой императора.

Особенности:

  • смена эры происходит не по математическому правилу
  • каждая эра связана с правлением императора
  • год считается относительно начала эры

CLDR хранит таблицу переходов между эрами, что позволяет корректно отображать даты.

Globalize применяет эти данные при форматировании, не изменяя исходный timestamp.


Лунно-солнечные календари

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

CLDR описывает:

  • циклы месяцев
  • вставочные месяцы
  • названия годов в цикле
  • соответствие григорианским датам

Globalize не выполняет вычисление этих циклов, а использует предрасчитанные соответствия CLDR для отображения.


Влияние календаря на локализацию интерфейсов

Календарная система влияет на:

  • порядок отображения даты (день/месяц/год)
  • названия месяцев и дней недели
  • формат времени (12/24 часа)
  • отображение эры
  • формат диапазонов дат

Даже при одинаковом timestamp разные локали могут давать принципиально разные визуальные представления.


Конфигурационные параметры календарей

При работе с Globalize и CLDR календарь может определяться через параметры форматирования:

  • date: "short" | "medium" | "long" | "full"
  • time: "short" | "medium" | "long" | "full"
  • calendar: "gregory" | "japanese" | "buddhist" | "islamic" | "hebrew"

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


Совместимость и ограничения модели

Календарная модель Globalize имеет ограничения:

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

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