Исламский календарь (хиджра) относится к лунным календарным системам,
основанным на фазах Луны. В международной локализации он представлен в
Unicode CLDR как набор календарных вариантов: islamic,
islamic-civil, islamic-umalqura,
islamic-tbla. Библиотека Globalize не реализует календарную
математику самостоятельно — она опирается на CLDR и механизмы
Intl.DateTimeFormat, обеспечивая корректное отображение дат
в зависимости от выбранной календарной системы.
CLDR (Common Locale Data Repository) определяет несколько вариантов исламского календаря:
Каждый из вариантов отличается алгоритмом вычисления начала месяца, что приводит к различиям в датах на 1–2 дня.
Globalize использует эти определения через системный
Intl, поэтому точность результата зависит от реализации
движка JavaScript.
Перед использованием календарей необходимо загрузить CLDR-данные. Globalize требует явной инициализации, так как не содержит встроенных локализационных данных.
import Globalize from "globalize";
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import timeZoneNames from "cldr-data/supplemental/metaZones.json";
import weekData from "cldr-data/supplemental/weekData.json";
import caGregorian from "cldr-data/main/ar/ca-gregorian.json";
import numbers from "cldr-data/main/ar/numbers.json";
import timeZoneData from "cldr-data/main/ar/timeZoneNames.json";
Globalize.load(
likelySubtags,
weekData,
timeZoneNames,
caGregorian,
numbers,
timeZoneData
);
Globalize.locale("ar");
Здесь используется арабская локаль как пример, поскольку исламский календарь чаще всего применяется в арабоязычных регионах.
Globalize предоставляет API для форматирования дат через
dateFormatter. Форматирование по умолчанию использует
григорианский календарь, но может быть переопределено через
Intl-опции.
const formatter = Globalize.dateFormatter({
datetime: "long"
});
formatter(new Date());
Однако исламский календарь включается через параметр календаря.
Современные браузеры и Node.js (через ICU) позволяют указывать
календарь через Intl.DateTimeFormat. Globalize использует
этот механизм под капотом.
islamicconst islamicFormatter = Globalize.dateFormatter({
datetime: "full",
calendar: "islamic"
});
console.log(islamicFormatter(new Date()));
Вывод будет содержать дату, представленную в формате хиджры.
Гражданская версия используется для административных расчётов и фиксирует длину месяцев по арифметическому правилу.
const civilFormatter = Globalize.dateFormatter({
date: "long",
calendar: "islamic-civil"
});
console.log(civilFormatter(new Date()));
Один из наиболее точных календарей, используемый в Саудовской Аравии.
const umalquraFormatter = Globalize.dateFormatter({
date: "long",
calendar: "islamic-umalqura"
});
console.log(umalquraFormatter(new Date()));
Табличная версия, основанная на фиксированных циклах.
const tblaFormatter = Globalize.dateFormatter({
date: "long",
calendar: "islamic-tbla"
});
console.log(tblaFormatter(new Date()));
Поддержка исламского календаря зависит от реализации
Intl.DateTimeFormat.
Проверка доступности календарей:
console.log(
Intl.DateTimeFormat.supportedLocalesOf("ar", {
calendar: "islamic"
})
);
Если окружение не поддерживает указанный календарь, поведение может быть приведено к григорианскому календарю или возвращать стандартное форматирование без конвертации.
Globalize поддерживает уровни детализации:
shortmediumlongfullПример:
const formatter = Globalize.dateFormatter({
datetime: "medium",
calendar: "islamic"
});
formatter(new Date());
Различие заключается в наличии времени, числовом представлении месяца и текстовом формате.
В арабских локалях даты могут отображаться справа налево и использовать арабские цифры. Это управляется через CLDR-данные:
Globalize.locale("ar-SA");
const formatter = Globalize.dateFormatter({
date: "full",
calendar: "islamic-umalqura"
});
formatter(new Date());
В этом режиме подключаются:
Исламский календарь часто используется вместе с арабской-индийской системой цифр.
const formatter = Globalize.numberFormatter();
formatter(1446);
При установленной локали ar возможен вывод:
Это важно для корректного отображения дат хиджры, где числовая система отличается от латинской.
Во многих интерфейсах требуется отображение двух календарей одновременно.
const gregorian = Globalize.dateFormatter({
date: "long"
});
const islamic = Globalize.dateFormatter({
date: "long",
calendar: "islamic-umalqura"
});
const now = new Date();
console.log(gregorian(now));
console.log(islamic(now));
Такой подход используется в религиозных приложениях, календарях событий и административных системах стран с двойной календарной системой.
Использование исламского календаря через Globalize имеет ряд особенностей:
Также важно учитывать, что разные исламские календари могут давать различие в датах, особенно в переходные дни месяца.
При проектировании интерфейсов, использующих Globalize, важно разделять:
function formatUserDate(date, locale, calendar) {
const g = Globalize(locale);
return g.dateFormatter({
date: "long",
calendar
})(date);
}
formatUserDate(new Date(), "ar", "islamic-umalqura");
Globalize в современных версиях фактически работает как обёртка над
Intl. Это означает:
Исламский календарь в таком подходе становится частью стандартной экосистемы интернационализации ECMAScript, а не отдельной подсистемой библиотеки.