Персидский календарь

Персидский календарь в Globalize опирается на данные CLDR (Unicode Common Locale Data Repository), где он представлен как Solar Hijri календарь (هجری شمسی). Внутри CLDR он обозначается как persian и используется в локали fa-IR. В отличие от григорианской системы, здесь год начинается с момента весеннего равноденствия, а структура месяцев фиксирована относительно солнечного цикла, что делает календарь более согласованным с астрономическим годом.

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

  • солнечная система летоисчисления;
  • начало года совпадает с Наврузом (Nowruz);
  • 12 месяцев, из которых первые 6 содержат по 31 дню;
  • следующие 5 месяцев содержат по 30 дней;
  • последний месяц содержит 29 или 30 дней в зависимости от високосного года;
  • високосный цикл не совпадает с григорианским и основан на астрономических расчетах.

В CLDR календарь определяется как persian, а локаль, использующая его по умолчанию — fa-IR.

Подключение данных CLDR для Globalize

Globalize не содержит встроенных данных календаря и требует явного подключения CLDR-файлов. Для работы с персидским календарём необходимо загрузить соответствующие JSON-ресурсы:

import Globalize from "globalize";

// CLDR data
import cldrData from "cldr-data";
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import timeData from "cldr-data/supplemental/timeData.json";
import weekData from "cldr-data/supplemental/weekData.json";

import numbers from "cldr-data/main/fa/numbers.json";
import calendars from "cldr-data/main/fa/ca-persian.json";
import dateFields from "cldr-data/main/fa/dateFields.json";

Инициализация CLDR:

Globalize.load(
  likelySubtags,
  timeData,
  weekData,
  numbers,
  calendars,
  dateFields
);

Globalize.locale("fa-IR");

Ключевым элементом является ca-persian.json, содержащий специфику солнечного календаря.

Использование календаря через Unicode расширения локали

Globalize и CLDR поддерживают выбор календаря через Unicode extension u-ca-persian:

const globalize = new Globalize("fa-IR-u-ca-persian");

Эта запись задаёт локаль с явно указанной календарной системой, отличной от стандартной григорианской.

Форматирование дат в персидском календаре

Globalize использует ICU DateTimeFormatter под капотом через CLDR patterns.

const formatter = globalize.dateFormatter({ datetime: "medium" });

const date = new Date(2026, 2, 21); // JS Date (Gregorian)
formatter(date);

Результат отображается в системе отсчёта персидского календаря, где дата будет преобразована в соответствующий год, месяц и день Solar Hijri.

Для более точного контроля формата используется:

const formatter = globalize.dateFormatter({
  skeleton: "yMMMMd"
});

formatter(new Date());

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

Отображение компонентов даты

Персидский календарь влияет не только на полную дату, но и на отдельные элементы:

const yearFormatter = globalize.dateFormatter({ year: "numeric" });
const monthFormatter = globalize.dateFormatter({ month: "long" });
const dayFormatter = globalize.dateFormatter({ day: "numeric" });

const now = new Date();

yearFormatter(now);
monthFormatter(now);
dayFormatter(now);

Результаты соответствуют системе Solar Hijri, а не григорианской нумерации.

Названия месяцев и дней недели

CLDR содержит локализованные названия месяцев персидского календаря:

  • فروردین (Farvardin)
  • اردیبهشت (Ordibehesht)
  • خرداد (Khordad)
  • تیر (Tir)
  • مرداد (Mordad)
  • شهریور (Shahrivar)
  • مهر (Mehr)
  • آبان (Aban)
  • آذر (Azar)
  • دی (Dey)
  • بهمن (Bahman)
  • اسفند (Esfand)

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

Пример:

const monthName = globalize.dateFormatter({ month: "long" });
monthName(new Date());

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

Globalize поддерживает парсинг строковых дат с учётом календаря:

const parser = globalize.dateParser({ skeleton: "yMd" });

parser("1404/01/01");

Парсинг зависит от локали fa-IR-u-ca-persian. Внутри происходит преобразование из Solar Hijri в стандартный объект Date.

Особенности преобразования дат

JavaScript Date всегда хранит время в формате UTC на основе григорианского календаря. Персидский календарь в Globalize является слоем локализации поверх этой модели:

  • входные данные интерпретируются как Solar Hijri;
  • внутреннее представление конвертируется в Gregorian epoch;
  • вывод обратно форматируется в Persian calendar system.

Это означает, что календарь не заменяет JS Date, а трансформирует отображение и парсинг.

Високосные годы и корректировка дат

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

  • точку весеннего равноденствия;
  • долготу солнечного года;
  • корректировки цикла 33-летнего приближения.

Globalize не реализует логику самостоятельно, а опирается на CLDR, что обеспечивает консистентность с ICU.

Форматирование относительных дат

Относительные выражения также учитывают локаль:

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

relative(-1); // "دیروز" (вчера)
relative(1);  // "فردا" (завтра)

Хотя относительные формы не зависят напрямую от календаря, они согласованы с локалью fa-IR.

Работа с диапазонами дат

Globalize поддерживает форматирование интервалов:

const rangeFormatter = globalize.dateFormatter({
  datetime: "short"
});

rangeFormatter([new Date(2026, 0, 1), new Date(2026, 0, 10)]);

При использовании персидского календаря диапазон отображается в Solar Hijri системе.

Практические особенности интеграции

При использовании персидского календаря в Globalize важно учитывать следующие моменты:

  • все входные данные должны быть валидными JS Date;
  • строковый ввод должен соответствовать локали fa-IR-u-ca-persian;
  • ICU data обязателен для корректного отображения месяцев и правил календаря;
  • несоответствие CLDR наборов приводит к падению форматирования или fallback на Gregorian.

Типовые сценарии использования

Персидский календарь применяется в:

  • государственном ПО Ирана и Афганистана;
  • системах бухгалтерского учёта с локальной датировкой;
  • интерфейсах планирования событий;
  • исторических и астрономических приложениях.

Globalize обеспечивает унифицированный слой локализации, позволяющий интегрировать Solar Hijri календарь без ручной реализации алгоритмов конвертации.