Исламский календарь

Исламский календарь (хиджра) относится к лунным календарным системам, основанным на фазах Луны. В международной локализации он представлен в Unicode CLDR как набор календарных вариантов: islamic, islamic-civil, islamic-umalqura, islamic-tbla. Библиотека Globalize не реализует календарную математику самостоятельно — она опирается на CLDR и механизмы Intl.DateTimeFormat, обеспечивая корректное отображение дат в зависимости от выбранной календарной системы.


Поддержка исламских календарей в CLDR

CLDR (Common Locale Data Repository) определяет несколько вариантов исламского календаря:

  • islamic — традиционный наблюдательный календарь
  • islamic-civil — гражданская арифметическая версия
  • islamic-umalqura — календарь Умм аль-Кура (Саудовская Аравия)
  • islamic-tbla — табличная версия

Каждый из вариантов отличается алгоритмом вычисления начала месяца, что приводит к различиям в датах на 1–2 дня.

Globalize использует эти определения через системный Intl, поэтому точность результата зависит от реализации движка JavaScript.


Подготовка окружения Globalize

Перед использованием календарей необходимо загрузить 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 использует этот механизм под капотом.

Пример с календарём islamic

const islamicFormatter = Globalize.dateFormatter({
  datetime: "full",
  calendar: "islamic"
});

console.log(islamicFormatter(new Date()));

Вывод будет содержать дату, представленную в формате хиджры.


Варианты исламского календаря

islamic-civil

Гражданская версия используется для административных расчётов и фиксирует длину месяцев по арифметическому правилу.

const civilFormatter = Globalize.dateFormatter({
  date: "long",
  calendar: "islamic-civil"
});

console.log(civilFormatter(new Date()));

islamic-umalqura

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

const umalquraFormatter = Globalize.dateFormatter({
  date: "long",
  calendar: "islamic-umalqura"
});

console.log(umalquraFormatter(new Date()));

islamic-tbla

Табличная версия, основанная на фиксированных циклах.

const tblaFormatter = Globalize.dateFormatter({
  date: "long",
  calendar: "islamic-tbla"
});

console.log(tblaFormatter(new Date()));

Поведение Intl и зависимость от окружения

Поддержка исламского календаря зависит от реализации Intl.DateTimeFormat.

Проверка доступности календарей:

console.log(
  Intl.DateTimeFormat.supportedLocalesOf("ar", {
    calendar: "islamic"
  })
);

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


Форматы вывода дат

Globalize поддерживает уровни детализации:

  • short
  • medium
  • long
  • full

Пример:

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 имеет ряд особенностей:

  • отсутствие ручного контроля алгоритма конверсии дат
  • зависимость от ICU в Node.js и браузере
  • различия между движками JavaScript
  • невозможность точной синхронизации исторических дат без CLDR-данных

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


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

При проектировании интерфейсов, использующих Globalize, важно разделять:

  • внутреннее представление даты (обычно ISO / Gregorian)
  • отображаемую дату (Islamic calendar)
  • локальные настройки пользователя
function formatUserDate(date, locale, calendar) {
  const g = Globalize(locale);

  return g.dateFormatter({
    date: "long",
    calendar
  })(date);
}

formatUserDate(new Date(), "ar", "islamic-umalqura");

Совместимость с современными стандартами

Globalize в современных версиях фактически работает как обёртка над Intl. Это означает:

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

Исламский календарь в таком подходе становится частью стандартной экосистемы интернационализации ECMAScript, а не отдельной подсистемой библиотеки.