Communitygithub.com

Hijri-Daten (Umm al-Qura)

Verarbeitet islamische (Hijri-)Daten mit dem Umm-al-Qura-Kalender Saudi-Arabiens, inklusive Formatierung mit JavaScript Intl, Umrechnung zwischen Gregorianisch und Hijri, Python-Konvertierung mit hijridate (ehemals hijri-converter), Validierung, Speicherung und Beschriftung. Verwende dies, wenn eine App, ein Formular, ein Bericht oder eine Datenbank Hijri-Daten (التاريخ الهجري، تقويم أم القرى), islamische Monatsnamen, Datumsumrechnung oder saudische Datumsanzeige benötigt.

Was ist Hijri-Daten (Umm al-Qura)?

Diese Fähigkeit (Skill) bietet eine umfassende Anleitung zur Handhabung von Hijri-Daten nach dem offiziellen Umm-al-Qura-Kalender Saudi-Arabiens. Sie erklärt die grundlegenden Regeln, wie etwa die Speicherung von Daten im ISO-Gregorianischen Format und die Konvertierung nur für die Anzeige, sowie die eindeutige Kennzeichnung des verwendeten Kalenders. Der Skill enthält detaillierte Codebeispiele für JavaScript (Intl.DateTimeFormat), mit denen sich Hijri-Daten formatieren und zwischen Gregorianisch und Hijri umrechnen lassen, sowie für Python (hijridate). Er behandelt wichtige Fallstricke wie die Wahl des falschen Kalenders (z.B. islamic-civil), Zeitzonenprobleme, Hijri-Datumsarithmetik und die eindeutige Beschriftung von Daten. Außerdem werden spezifische islamische Monatsnamen, Validierungstechniken (z.B. Erkennung unmöglicher Tage) und eine Referenztabelle mit bekannten Datumspaaren bereitgestellt. Die Plattformen sind JavaScript/TypeScript und Python; die Anleitung ist für Entwickler gedacht, die Hijri-Daten in Web-Apps, mobilen Apps, Backend-Diensten oder Datenbanken korrekt verarbeiten müssen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/hosam382/arabic-claude-skills/tree/HEAD/hijri-dates

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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

  1. Speichere ISO-Gregorianische Daten (2026-11-03, eine DATE-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.
  2. Kennzeichne immer, welchen Kalender ein angezeigtes Datum verwendet: «23 جمادى الأولى 1448هـ» und «3 November 2026م».
  3. 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“.
  4. Ein Hijri-String wie 1448-05-23 ist kein ISO 8601. Übergib ihn niemals an new Date(); er würde als das Jahr 1448 n. Chr. interpretiert werden.
  5. 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, dass ar-SA Hijri bedeutet: In neueren ICU/CLDR-Versionen (Node 24, aktuelles Chrome) ist der Standardkalender für ar-SA Gregorianisch.
  • Lege Ziffern explizit mit nu-latn (0-9) oder nu-arab (٠-٩) fest. Die Voreinstellungen variieren je nach Locale und Version: ar-SA ergibt ٠-٩, einfaches ar ergibt 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 mit timeZone: 'UTC'. Für „heute in Saudi-Arabien“ verwende timeZone: 'Asia/Riyadh'. Der Zeitpunkt 2026-11-03T22:30Z ist 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-converter und from hijri_converter import Hijri, Gregorian. Es funktioniert noch, gibt aber jetzt eine DeprecationWarning aus; wechsle den Import zu hijridate.
  • 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 range ausgelöst.
  • Ein unmöglicher Tag löst einen ValueError aus, z. B. Hijri(1448, 1, 30): „day must be in 1..29 for month“.
  • In .NET verwende UmAlQuraCalendar, nicht HijriCalendar (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-umalqura den 23., mit islamic-civil den 22. und mit islamic den 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)

HijriGregorianisch
1 Ramadan 14472026-02-18
1 Muharram 14482026-06-16
23 Jumada al-Ula 14482026-11-03
10 Dhu al-Hijjah 14462025-06-06

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Verwandte Skills