Was macht Hijri-Daten (Umm al-Qura)?
Der offizielle Hijri-Kalender Saudi-Arabiens ist Umm al-Qura (أم القرى), ein berechneter Kalender. Andere „islamische“ Kalender verwenden unterschiedliche Regeln und weichen oft um einen Tag ab. Daher sollte der Kalender im Code und in der Benutzeroberfläche immer benannt werden.
Regeln
- Speichere ISO-Gregorianische Daten (
2026-11-03, eineDATE-Spalte oder einen UTC-Zeitstempel). Konvertiere nur für die Anzeige in Hijri. Wenn ein Benutzer ein Hijri-Datum eingibt, konvertiere es bei der Eingabe in ein Gregorianisches Datum und speichere dieses. - Kennzeichne immer, welchen Kalender ein angezeigtes Datum verwendet: «23 جمادى الأولى 1448هـ» und «3 November 2026م».
- Hijri-Monate haben 29 oder 30 Tage und ein Jahr hat 354 oder 355 Tage. Verwende niemals feste Monatslängen oder „30 Tage addieren“ für „nächsten Monat“.
- Ein Hijri-String wie
1448-05-23ist kein ISO 8601. Übergib ihn niemals annew Date(); er würde als das Jahr 1448 n. Chr. interpretiert werden. - Religiöse Daten (Beginn des Ramadan, Eid) werden durch Mondbeobachtung bekanntgegeben und können vom gedruckten Umm-al-Qura-Datum abweichen. Präsentiere berechnete Daten für sie als «حسب تقويم أم القرى» oder «متوقع», niemals als sicher.
JavaScript: Formatierung mit Intl
const d = new Date(Date.UTC(2026, 10, 3)); // 3. Nov. 2026
new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', { dateStyle: 'full', timeZone: 'UTC' }).format(d);
// "الثلاثاء، ٢٣ جمادى الأولى ١٤٤٨ هـ"
new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura-nu-latn',
{ day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' }).format(d);
// "23 جمادى الأولى 1448 هـ"
new Intl.DateTimeFormat('en-u-ca-islamic-umalqura-nu-latn',
{ day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' }).format(d);
// "Jumada I 23, 1448 AH"
- Schreibe immer explizit
ca-islamic-umalqura. Verlasse dich nicht darauf, dassar-SAHijri bedeutet: In neueren ICU/CLDR-Versionen (Node 24, aktuelles Chrome) ist der Standardkalender fürar-SAGregorianisch. - Lege Ziffern explizit mit
nu-latn(0-9) odernu-arab(٠-٩) fest. Die Voreinstellungen variieren je nach Locale und Version:ar-SAergibt ٠-٩, einfachesarergibt jetzt 0-9. - Exakte Zeichenfolgen (Leerzeichen vor «هـ», „AH“, „Jumada I“ versus „Jumada al-Ula“) variieren zwischen den Engines. Parst niemals formatierte Texte und verwendet niemals Snapshot-Tests über verschiedene Umgebungen hinweg. Verwende
formatToParts. - Die Zeitzone entscheidet über den Tag.
new Date('2026-11-03')ist UTC-Mitternacht, also formatiere es mittimeZone: 'UTC'. Für „heute in Saudi-Arabien“ verwendetimeZone: 'Asia/Riyadh'. Der Zeitpunkt2026-11-03T22:30Zist in Riad bereits der 24. Dschumada al-Ula.
Gregorianisch zu Hijri-Zahlen
const hijriParts = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura-nu-latn', {
day: 'numeric', month: 'numeric', year: 'numeric', timeZone: 'UTC',
});
export function toHijri(date) {
const p = {};
for (const { type, value } of hijriParts.formatToParts(date)) p[type] = value;
return { year: parseInt(p.year, 10), month: parseInt(p.month, 10), day: parseInt(p.day, 10) };
}
toHijri(new Date(Date.UTC(2026, 10, 3))); // { year: 1448, month: 5, day: 23 }
Hijri zu Gregorianisch: Tage durchsuchen
Intl kann keine Hijri-Daten parsen, also schätze das Gregorianische Datum und durchsuche nahegelegene Tage, bis toHijri übereinstimmt.
const DAY = 86400000;
export function hijriToGregorian(y, m, d) {
// 1 Muharram 1 AH ist etwa der 19. Juli 622 (proleptisch Gregorianisch); mittlerer Monat 29,530589 Tage
const est = Date.UTC(622, 6, 19) + Math.round((y - 1) * 354.36667 + (m - 1) * 29.530589 + (d - 1)) * DAY;
for (let off = -20; off <= 20; off++) {
const t = new Date(est + off * DAY);
const h = toHijri(t);
if (h.year === y && h.month === m && h.day === d) return t.toISOString().slice(0, 10);
}
return null; // kein solcher Tag, z.B. Tag 30 in einem 29-tägigen Monat
}
hijriToGregorian(1447, 9, 1); // "2026-02-18"
hijriToGregorian(1448, 1, 1); // "2026-06-16"
hijriToGregorian(1448, 1, 30); // null (Muharram 1448 hat 29 Tage)
- Ein
null-Ergebnis ist die Validierung einer Benutzereingabe; zeige «هذا اليوم غير موجود في هذا الشهر» an. - Monatslänge:
hijriToGregorian(y, m, 30) ? 30 : 29. - Die Umm-al-Qura-Tabelle der ICU deckt den Zeitraum 1300 bis 1600 AH ab. Außerhalb dieses Bereichs greifen Engines auf den tabellarischen Kalender zurück, daher sind die Ergebnisse dort nicht Umm al-Qura.
- Akzeptiere arabisch-indische Ziffern, die von Benutzern eingegeben werden: Konvertiere ٠-٩ in 0-9 vor dem Parsen (siehe
arabic-rtl-web).
Python: hijridate
# pip install hijridate (Nachfolger von hijri-converter, gleiche API)
from hijridate import Hijri, Gregorian
h = Gregorian(2026, 11, 3).to_hijri() # Hijri(1448, 5, 23)
h.isoformat() # '1448-05-23'
h.dmyformat() # '23/05/1448'
h.month_name() # 'Jumada al-Ula'
h.month_name('ar') # 'جمادى الأولى'
h.day_name('ar') # 'الثلاثاء'
h.notation('ar') # 'هـ'
h.month_length() # 30
g = Hijri(1447, 9, 1).to_gregorian() # Gregorian(2026, 2, 18), eine Unterklasse von datetime.date
Hijri.today()
- Älterer Code verwendet
pip install hijri-converterundfrom hijri_converter import Hijri, Gregorian. Es funktioniert noch, gibt aber jetzt eine DeprecationWarning aus; wechsle den Import zuhijridate. - Unterstützter Bereich: 1 Muharram 1343 AH bis 30 Dhu al-Hijjah 1500 AH (1924-08-01 bis 2077-11-16 n. Chr.). Außerhalb dieses Bereichs wird ein
OverflowError: date out of rangeausgelöst. - Ein unmöglicher Tag löst einen
ValueErroraus, z. B.Hijri(1448, 1, 30): „day must be in 1..29 for month“. - In .NET verwende
UmAlQuraCalendar, nichtHijriCalendar(welches der tabellarische kuwaitische Algorithmus ist).
Monatsnamen
1 محرم، 2 صفر، 3 ربيع الأول، 4 ربيع الآخر، 5 جمادى الأولى، 6 جمادى الآخرة، 7 رجب، 8 شعبان، 9 رمضان، 10 شوال، 11 ذو القعدة، 12 ذو الحجة.
Die Schreibweise unterscheidet sich zwischen Bibliotheken: ICU gibt «ربيع الآخر» aus, während hijridate «ربيع الثاني» ausgibt; auch das Englische variiert („Rabiʻ II“, „Rabi' al-Thani“). Für eine konsistente Benutzeroberfläche ordne Monatsnummern deiner eigenen Liste zu, anstatt Bibliotheksstrings zu mischen.
Fallstricke
- Falscher Kalender. Für den 3. Nov. 2026 liefert Node 24 mit
islamic-umalquraden 23., mitislamic-civilden 22. und mitislamicden 24. Excel und der Windows-„Hijri“-Kalender verwenden den kuwaitischen tabellarischen Algorithmus. Verwende Umm al-Qura für saudische Daten. - Abweichung um einen Tag aufgrund von Zeitzonen: Formatiere in derselben Zeitzone, in der das Datum gespeichert wurde.
- Datumsarithmetik in Hijri. Für „nächsten Monat“ erhöhe die Monatsnummer, begrenze den Tag auf die Länge dieses Monats und konvertiere dann. Berechne Alter und Zeiträume in Gregorianisch.
- Unbeschriftete Daten. Ein bloßes «1/5/1448» oder «5/1» ist mehrdeutig; füge immer هـ oder م hinzu.
- Gemischte Ziffern. Verwende ein einziges Ziffernsystem pro Seite.
Teste mit bekannten Paaren (Umm al-Qura)
| Hijri | Gregorianisch |
|---|---|
| 1 Ramadan 1447 | 2026-02-18 |
| 1 Muharram 1448 | 2026-06-16 |
| 23 Jumada al-Ula 1448 | 2026-11-03 |
| 10 Dhu al-Hijjah 1446 | 2025-06-06 |