Dates Hijries (Umm al-Qura)
Le calendrier Hijri officiel de l'Arabie Saoudite est Umm al-Qura (أم القرى), un calendrier calculé. Les autres calendriers « islamiques » utilisent des règles différentes et diffèrent souvent d'un jour, donc nommez toujours le calendrier dans le code et dans l'interface utilisateur.
Règles
- Stockez les dates Grégoriennes ISO (
2026-11-03, une colonneDATEou un timestamp UTC). Convertissez en Hijri uniquement pour l'affichage. Lorsqu'un utilisateur saisit une date Hijri, convertissez-la en Grégorien à l'entrée et stockez cette valeur. - Étiquetez toujours le calendrier utilisé pour une date affichée : «23 جمادى الأولى 1448هـ» et «3 novembre 2026م».
- Les mois Hijris ont 29 ou 30 jours et une année compte 354 ou 355 jours. N'utilisez jamais de longueurs de mois fixes ni « ajouter 30 jours » pour « le mois prochain ».
- Une chaîne Hijri comme
1448-05-23n'est pas ISO 8601. Ne la passez jamais ànew Date(); elle serait interprétée comme l'année 1448 EC. - Les dates religieuses (début du Ramadan, Aïd) sont annoncées par l'observation de la lune et peuvent différer de la date imprimée d'Umm al-Qura. Présentez les dates calculées pour celles-ci comme «حسب تقويم أم القرى» ou «متوقع», jamais comme certaines.
JavaScript : formatage avec 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"
- Écrivez toujours
ca-islamic-umalquraexplicitement. Ne vous fiez pas àar-SAsignifiant Hijri : dans les versions récentes d'ICU/CLDR (Node 24, Chrome actuel), le calendrier par défaut pourar-SAest Grégorien. - Définissez les chiffres explicitement avec
nu-latn(0-9) ounu-arab(٠-٩). Les valeurs par défaut diffèrent selon la locale et la version :ar-SAdonne ٠-٩,arsimple donne maintenant 0-9. - Les chaînes exactes (espacement avant «هـ », «AH», «Jumada I» versus «Jumada al-Ula») varient entre les moteurs. N'analysez jamais le texte formaté et ne faites jamais de test par instantané sur différents environnements. Utilisez
formatToParts. - Le fuseau horaire détermine le jour.
new Date('2026-11-03')est minuit UTC, donc formatez-le avectimeZone: 'UTC'. Pour « aujourd'hui en Arabie Saoudite », utiliseztimeZone: 'Asia/Riyadh'. L'instant2026-11-03T22:30Zest déjà le 24 جمادى الأولى à Riyad.
Grégorien vers Hijri (nombres)
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 vers Grégorien : parcours des jours
Intl ne peut pas analyser les dates Hijries, donc estimez la date Grégorienne et parcourez les jours voisins jusqu'à ce que toHijri corresponde.
const DAY = 86400000;
export function hijriToGregorian(y, m, d) {
// 1 Muharram 1 AH correspond environ au 19 juillet 622 (Grégorien proleptique) ; mois moyen 29.530589 jours
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; // ce jour n'existe pas, ex. le 30 d'un mois de 29 jours
}
hijriToGregorian(1447, 9, 1); // "2026-02-18"
hijriToGregorian(1448, 1, 1); // "2026-06-16"
hijriToGregorian(1448, 1, 30); // null (Muharram 1448 a 29 jours)
- Un résultat
nullest la façon de valider la saisie utilisateur ; affichez «هذا اليوم غير موجود في هذا الشهر». - Longueur du mois :
hijriToGregorian(y, m, 30) ? 30 : 29. - La table Umm al-Qura d'ICU couvre 1300 à 1600 AH. En dehors de cette plage, les moteurs utilisent le calendrier tabulaire, donc les résultats n'y sont pas Umm al-Qura.
- Acceptez les chiffres arabo-indiens saisis par les utilisateurs : convertissez ٠-٩ en 0-9 avant l'analyse (voir
arabic-rtl-web).
Python : hijridate
# pip install hijridate (successeur de hijri-converter, même 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), une sous-classe de datetime.date
Hijri.today()
- Le code plus ancien utilise
pip install hijri-converteretfrom hijri_converter import Hijri, Gregorian. Cela fonctionne encore mais émet maintenant un DeprecationWarning ; changez l'import pourhijridate. - Plage supportée : 1 Muharram 1343 AH à 30 Dhu al-Hijjah 1500 AH (1924-08-01 à 2077-11-16 EC). En dehors,
OverflowError: date out of range. - Un jour impossible lève
ValueError, par exempleHijri(1448, 1, 30): "day must be in 1..29 for month". - Dans .NET, utilisez
UmAlQuraCalendar, pasHijriCalendar(qui est l'algorithme tabulaire koweïtien).
Noms des mois
1 محرم، 2 صفر، 3 ربيع الأول، 4 ربيع الآخر، 5 جمادى الأولى، 6 جمادى الآخرة، 7 رجب، 8 شعبان، 9 رمضان، 10 شوال، 11 ذو القعدة، 12 ذو الحجة.
L'orthographe diffère entre les bibliothèques : ICU affiche «ربيع الآخر» tandis que hijridate affiche «ربيع الثاني» ; l'anglais varie aussi ("Rabiʻ II", "Rabi' al-Thani"). Pour une interface utilisateur cohérente, mappez les numéros de mois sur votre propre liste au lieu de mélanger les chaînes des bibliothèques.
Pièges
- Mauvais calendrier. Pour le 3 nov. 2026, Node 24 donne 23 avec
islamic-umalqura, 22 avecislamic-civilet 24 avecislamic. Excel et le calendrier « Hijri » de Windows utilisent l'algorithme tabulaire koweïtien. Utilisez Umm al-Qura pour les dates saoudiennes. - Décalage d'un jour dû aux fuseaux horaires : formatez dans le même fuseau que celui où la date a été stockée.
- Calculs arithmétiques en Hijri. Pour « le mois prochain », incrémentez le numéro du mois, limitez le jour à la longueur de ce mois, puis convertissez. Calculez les âges et les durées en Grégorien.
- Dates non étiquetées. Un simple «1/5/1448» ou «5/1» est ambigu ; ajoutez toujours هـ ou م.
- Chiffres mélangés. Gardez un seul système de chiffres par page.
Test avec des paires connues (Umm al-Qura)
| Hijri | Grégorien |
|---|---|
| 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 |