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

Модель календаря в ECMAScript Internationalization API

В Intl API календарная система является частью международной локализации и управляется через Unicode Extension u-ca (calendar). Поддержка исламского календаря реализуется через несколько вариантов алгоритмов, каждый из которых отражает разные методы астрономического или административного расчёта.

Календарь задаётся либо через опцию calendar в Intl.DateTimeFormat, либо через расширение локали:

new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic'
});

или

new Intl.DateTimeFormat('ar-SA-u-ca-islamic');

Календарная система влияет исключительно на представление даты, не изменяя внутреннее представление времени в JavaScript, которое остаётся в формате Unix Epoch (UTC-based timestamp).


Варианты исламских календарей в Intl

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

islamic

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

new Intl.DateTimeFormat('en-u-ca-islamic', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(new Date());

islamic-umalqura

Наиболее распространённый вариант в современных локализациях, особенно в Саудовской Аравии. Основан на наблюдениях и расчётах, используемых для официального календаря Хиджры.

new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(new Date());

islamic-civil

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

new Intl.DateTimeFormat('en-u-ca-islamic-civil', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

islamic-tbla

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

new Intl.DateTimeFormat('en-u-ca-islamic-tbla');

islamic-rgsa

Региональная система, применяемая в некоторых административных реализациях календаря Саудовской Аравии.

new Intl.DateTimeFormat('ar-u-ca-islamic-rgsa');

Принцип работы календаря в Intl DateTimeFormat

При использовании исламского календаря происходит трансформация григорианской даты в соответствующее представление Хиджры. Внутренний timestamp остаётся неизменным.

const date = new Date('2026-05-27T00:00:00Z');

const fmt = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

fmt.format(date);

Результат зависит от локали и выбранного алгоритма календаря, но структура всегда включает:

  • исламский год (AH — Anno Hegirae)
  • исламский месяц
  • день месяца по лунному циклу

Локали и календарные расширения

Unicode Extension u-ca может комбинироваться с локалью языка, влияя на формат чисел, порядок вывода и названия месяцев.

Примеры комбинаций:

'ar-SA-u-ca-islamic-umalqura'
'en-u-ca-islamic'
'fr-u-ca-islamic-civil'

Локаль определяет:

  • систему чисел (арабские, латинские цифры)
  • направление текста (LTR/RTL)
  • форматирование месяцев (полное имя или сокращение)

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

Intl.DateTimeFormat позволяет гибко управлять выводом элементов исламского календаря.

new Intl.DateTimeFormat('ar-u-ca-islamic-umalqura', {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

Поддерживаемые поля:

  • year
  • month
  • day
  • weekday
  • hour, minute, second (не зависят от календаря, но отображаются в контексте локали)

Особенности исламского календаря в JavaScript

Лунная природа системы

Исламский календарь основан на лунных циклах, поэтому:

  • год короче григорианского примерно на 10–12 дней
  • месяцы могут смещаться относительно сезонов
  • одна и та же григорианская дата соответствует разным исламским датам в разные годы

Несовпадение региональных расчётов

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

  • islamic-umalqura
  • islamic-civil
  • islamic
  • islamic-tbla

Intl API предоставляет эти варианты, но не унифицирует их результат.


Intl.Locale и исламский календарь

Объект Intl.Locale позволяет явно задавать календарную систему как часть локали.

const locale = new Intl.Locale('ar-SA-u-ca-islamic-umalqura');

locale.calendar;

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


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

const date = new Date('2026-05-27');

const g = new Intl.DateTimeFormat('en-GB', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(date);

const h = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(date);

Разница заключается в системе отсчёта:

  • григорианский календарь опирается на солнечный цикл
  • исламский календарь опирается на лунный цикл

Поведение числовых форматов

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

new Intl.DateTimeFormat('ar-u-ca-islamic', {
  year: 'numeric'
}).format(new Date());

Год может отличаться на десятки единиц от григорианского, поскольку отсчёт ведётся от 622 года н.э. (Хиджра).


Использование в интерфейсах

Islamic calendar formatting применяется в системах, где требуется отображение дат религиозного или культурного значения:

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

Intl API обеспечивает локализационное представление без необходимости ручного преобразования дат.


Ограничения реализации

Несмотря на широкую поддержку, существуют ограничения:

  • отсутствует универсальный алгоритм конвертации между всеми исламскими вариантами
  • поведение может различаться между средами (Node.js, браузеры)
  • не все локали поддерживают полный набор исламских календарей
  • нет встроенной обратной конверсии «исламская дата → григорианская» через Intl API

Работа остаётся односторонней: от timestamp к представлению.


Формирование даты с учётом календарной системы

const formatter = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  weekday: 'long'
});

const parts = formatter.formatToParts(new Date());

Метод formatToParts позволяет разложить исламскую дату на компоненты:

  • literal separators
  • year
  • month
  • day
  • weekday

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


Поведение с временными зонами

Календарная система не влияет на таймзону, однако отображаемое значение даты может изменяться в зависимости от локального времени:

new Intl.DateTimeFormat('en-u-ca-islamic-umalqura', {
  timeZone: 'Asia/Riyadh'
});

Таким образом, итоговая дата формируется как комбинация:

  • timestamp
  • time zone
  • calendar system
  • locale

Интероперабельность с другими API

Исламский календарь в Intl API часто используется совместно с:

  • Temporal (в современных реализациях)
  • Date
  • Intl.RelativeTimeFormat
  • Intl.NumberFormat

Однако календарная система в Intl остаётся исключительно форматирующим слоем и не влияет на арифметику дат в стандартном Date.