Персидский календарь в Globalize опирается на данные CLDR (Unicode
Common Locale Data Repository), где он представлен как Solar Hijri
календарь (هجری شمسی). Внутри CLDR он обозначается как
persian и используется в локали fa-IR. В
отличие от григорианской системы, здесь год начинается с момента
весеннего равноденствия, а структура месяцев фиксирована относительно
солнечного цикла, что делает календарь более согласованным с
астрономическим годом.
Персидский календарь характеризуется следующими свойствами:
В CLDR календарь определяется как persian, а локаль,
использующая его по умолчанию — fa-IR.
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, содержащий
специфику солнечного календаря.
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 содержит локализованные названия месяцев персидского календаря:
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
является слоем локализации поверх этой модели:
Это означает, что календарь не заменяет JS Date, а трансформирует отображение и парсинг.
В отличие от григорианского календаря, високосность в Solar Hijri вычисляется астрономически. CLDR содержит алгоритмы, которые учитывают:
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 важно учитывать следующие моменты:
fa-IR-u-ca-persian;Персидский календарь применяется в:
Globalize обеспечивает унифицированный слой локализации, позволяющий интегрировать Solar Hijri календарь без ручной реализации алгоритмов конвертации.