Communitygithub.com

dates-hijries

Gère les dates du calendrier Hijri (islamique) selon le calendrier Umm al-Qura utilisé en Arabie Saoudite, incluant le formatage avec JavaScript Intl, la conversion Grégorien vers Hijri et Hijri vers Grégorien, la conversion Python avec hijridate, la validation, le stockage et l'étiquetage. À utiliser lorsqu'une application, un formulaire, un rapport ou une base de données a besoin de dates Hijri (التاريخ الهجري، تقويم أم القرى), de noms de mois islamiques, de conversion de dates ou d'affichage de dates saoudiennes.

Qu'est-ce que dates-hijries ?

Ce skill fournit une approche complète et robuste pour gérer les dates du calendrier Hijri (islamique) selon le calendrier officiel Umm al-Qura (أم القرى) de l'Arabie Saoudite. Il explique pourquoi il est essentiel de toujours nommer explicitement le calendrier dans le code et l'interface utilisateur, car d'autres calendriers islamiques (comme le tabulaire koweïtien) peuvent différer d'un jour. Le skill couvre le formatage précis avec `Intl.DateTimeFormat` en JavaScript, en insistant sur l'utilisation de `ca-islamic-umalqura`, la gestion des fuseaux horaires, et l'évitement des pièges comme le parsing de texte formaté. Il propose des fonctions de conversion Grégorien vers Hijri via `formatToParts` et Hijri vers Grégorien par une recherche par jours. Côté Python, il documente l'utilisation de la bibliothèque `hijridate` (successeur de `hijri-converter`) pour la conversion et la validation. Le skill inclut des règles strictes de stockage (toujours en Grégorien), d'étiquetage (avec les symboles هـ et م), et de gestion des mois de 29 ou 30 jours. Il met en garde contre les pièges courants : utilisation du mauvais calendrier, décalage d'un jour dû aux fuseaux horaires, calculs arithmétiques en Hijri, et dates non étiquetées. Une table de paires de test (Hijri ↔ Grégorien) est fournie pour valider les implémentations. Ce skill est indispensable pour les développeurs travaillant sur des applications destinées au marché saoudien ou nécessitant une gestion fiable des dates islamiques, que ce soit en JavaScript, Python, .NET ou autres plateformes avec des bibliothèques appropriées.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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

  1. Stockez les dates Grégoriennes ISO (2026-11-03, une colonne DATE ou 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.
  2. Étiquetez toujours le calendrier utilisé pour une date affichée : «23 جمادى الأولى 1448هـ» et «3 novembre 2026م».
  3. 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 ».
  4. Une chaîne Hijri comme 1448-05-23 n'est pas ISO 8601. Ne la passez jamais à new Date() ; elle serait interprétée comme l'année 1448 EC.
  5. 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-umalqura explicitement. Ne vous fiez pas à ar-SA signifiant Hijri : dans les versions récentes d'ICU/CLDR (Node 24, Chrome actuel), le calendrier par défaut pour ar-SA est Grégorien.
  • Définissez les chiffres explicitement avec nu-latn (0-9) ou nu-arab (٠-٩). Les valeurs par défaut diffèrent selon la locale et la version : ar-SA donne ٠-٩, ar simple 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 avec timeZone: 'UTC'. Pour « aujourd'hui en Arabie Saoudite », utilisez timeZone: 'Asia/Riyadh'. L'instant 2026-11-03T22:30Z est 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 null est 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-converter et from hijri_converter import Hijri, Gregorian. Cela fonctionne encore mais émet maintenant un DeprecationWarning ; changez l'import pour hijridate.
  • 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 exemple Hijri(1448, 1, 30) : "day must be in 1..29 for month".
  • Dans .NET, utilisez UmAlQuraCalendar, pas HijriCalendar (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 avec islamic-civil et 24 avec islamic. 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)

HijriGrégorien
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.

Skills associés