devstory

Le Tutoriel de Java HijrahDate

  1. HijrahDate
  2. Basic Example
  3. Supported Range Example
  4. Month Length Example

1. HijrahDate

La classe HijrahDate représente les dates dans le système de calendrier Hijrah, communément appelé le calendrier islamique ou arabe, lequel est un système basé sur le calendrier lunaire, composé de 12 mois avec 354 ou 355 jours. Il est utilisé pour identifier les jours fériés islamiques, tels que la période de jeûne annuel ou l'événement Hijrah.
Le calendrier islamique utilise l'ère Hijrah (Hijrah era) qui correspond à l'année 622 dans le calendrier Gregorian (également appelé ISO). Cette année-là, Muhammad et ses adeptes ont immigré de Mecca (la Meque) jusqu'à Yathrib (l'actuel Medina) et créé la première communauté musulmane, cet événement a été décrété la Hijrah. En Occident, cette ère est souvent abréviée AH (Anno Hegirae en latin). Dans les pays musulmans, parfois, elle est abréviée H. En anglais, la période avant l'ère Hijrah est abréviée BH (Before Hijrah).
Le 1er janvier de l'année 1 dans le calandrier Hijrah correspond au 16 juillet 622. Le site web ci-dessous fournit un outil en ligne vous permettant de convenir les dates dans le calendrier Hijrah vers le calendrier Gregorian et vice versa:
Gregorian (ISO)
Hijrah
622-07-16
1-01-01
2000-01-01
1420-09-24
Year
Une année dans le calendrier islamique dispose d'environ 354 ou 355 jours, soit 11 jours de moins par rapport au calendrier Gregorian.
La formule approximative utilisée pour convertir le calandrier Hijrah (AH) vers le calendrier Gregorian (CE) et vice versa:
AH = (CE − 622) × 33 ÷ 32

CE = AH + 622 − (AH ÷ 32)
Month
Le calendrier islamique dispose de 12 mois avec 29 ou 30 jours. Si la Lune croissante est visible juste après le coucher du soleil le soir du 29, le jour suivant est le premier jour du nouveau mois. Si aucune observation n'est faite, le 30e jour est ajouté au mois en cours, lequel est ensuite suivi du premier jour du mois suivant.
La version traditionnelle du calendrier islamique exige d'une personne ou d'une commission autorisée qu'elle effectue une observation de la Lune croissante afin de déterminer la longueur de chaque mois.
Cette dépendance des observations astronomiques provoque des difficultés dans la détermination de la longueur des mois islamiques. Les nuages et les autres conditions météorologiques défavorables peuvent couvrir la Lune croissante. Lorsque cela se survient, le mois peut s'allonger d'un jour et retarder le début du nouveau mois et ses événements associés. C'est la raison pour laquelle les jours fériés des Musulmans peuvent varier à court terme.
Certains pays et communautés musulmanes utilisent actuellement des versions modifiées du calendrier traditionnel qui sont conçues pour faciliter la prévision des mois et des observations islamiques du calendrier islamique
Un nouveau mois peut également commencer à des jours différents dans différents pays. Étant donné que l'heure du coucher de la lune d'un endroit dépend de sa longitude, un nouveau mois et des rituels religieux importants comme le jeûne du Ramadan peuvent commencer un jour plus tôt dans les pays musulmans d'Afrique de l'Ouest qu'en Indonésie ou en Malaisie, par exemple.
Les noms des mois dans le calendrier Hijrah:
Months
ISO Months
Hijrah Months
1
January
Muharram
2
February
Safar
3
March
Rabi Al-Awwal
4
April
Rabi Al-Thani
5
May
Jumada Al-Awwal
6
June
Jumada Al-Thani
7
July
Rajab
8
August
Sha`ban
9
September
Ramadan
10
October
Shawwal
11
November
Dhul-Qa`dah
12
December
Dhul-Hijjah
Les noms des jours de la semaine :
English Day-Of-Week
Hijrah Day-Of-Week
1
Sunday
Al-Ahad
2
Monday
Al-Ithnayn
3
Tuesday
Al-Thulathaa
4
Wednesday
Al-Arbo’aa
5
Thursday
Al-Khamees
6
Friday
Al-Jum’ah
7
Saturday
Al-Sabt

2. Basic Example

À la base, le calendrier islamique dispose de nombreuses variantes, la raison étant que de nombreux pays et de nombreuses sectes l'utilisent. La classe HijrahDate en supporte plusieurs, l'important est que Java vous permette de la configurer pour ajouter de nouvelles variantes.
La variante par défaut prise en charge dans Java est "islamic-umalqura" - le calendrier islamique saoudien Umm Al-Qura. (Voir plus la classe HijrahChronology pour plus de détails.)
  • Le Tutoriel de Java HijrahChronology
Pour mieux comprendre, on va analyser l'exemple ci-dessous (en utilisant la variante du calendrier islamique par défaut) :
HijrahDate_default_variant_ex1.java
LocalDate localDate = LocalDate.of(2000, 1, 1);
HijrahDate hijrahDate = HijrahDate.from(localDate);

System.out.printf("localDate: %s%n", localDate); // 2000-01-01
System.out.printf("hijrahDate: %s%n%n", hijrahDate); // Hijrah-umalqura AH 1420-09-24

HijrahEra era = hijrahDate.getEra(); // HijrahEra.AH
System.out.printf(" > era.name(): %s%n%n", era.name()); // AH

HijrahChronology chronology = hijrahDate.getChronology();
System.out.printf(" > chronology.getId(): %s%n", chronology.getId()); // Hijrah-umalqura
System.out.printf(" > chronology.getCalendarType(): %s", chronology.getCalendarType()); // islamic-umalqura
Output:
localDate: 2000-01-01
hijrahDate: Hijrah-umalqura AH 1420-09-24

 > era.name(): AH

 > chronology.getId(): Hijrah-umalqura
 > chronology.getCalendarType(): islamic-umalqura
Le texte représentant une HijrahDate se compose de 3 parties :
Chronology ID:
(Identifiant chronologique) : Permettre de spécifier quelle variante utiliser. Les systèmes de calendrier Gregorian (ISO) et Japanese ne disposent d'aucune variation, donc cette information n'apparaît pas.
Era Name:
(Nom de l'ère) : Une seule époque est prise en charge, à savoir HijrahEra.AH.
Date:
L'information de date.

3. Supported Range Example

Bien qu'en pratique, le système de calendrier Hijrah ne limite pas la plage de dates, mais Java ne la prend en charge que dans une faible dimension, plus précisément :
(**) Test with Java 11.
Hijrah Date
ISO Date
From
Hijrah-umalqura AH 1300-01-01
1882-11-12
To
Hijrah-umalqura AH 1600-12-30
2174-11-25
L'exemple ci-dessous permet de trouver la date la plus petite et la plus grande dans le système de calendrier Hijrah pris en charge par Java.
HijrahDate_date_range_ex1.java
package org.o7planning.hijrahdate.ex;

import java.time.LocalDate;
import java.time.chrono.Chronology;
import java.time.chrono.HijrahChronology;
import java.time.chrono.HijrahDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.ValueRange;

public class HijrahDate_date_range_ex1 {
    public static void main(String[] args) {
        Chronology chronology = HijrahChronology.INSTANCE;
        ValueRange range = chronology.range(ChronoField.YEAR);
        int minYear = (int) range.getMinimum();
        int maxYear = (int) range.getMaximum();

        System.out.println("minYear: " + minYear);
        System.out.println("maxYear: " + maxYear);

        // ----- Find the first supported date --------
        // A Hijrah Month have 29 or 30 days.
        HijrahDate hijrahDate = null;
        try {
            hijrahDate = HijrahDate.of(minYear, 12, 30);
        } catch (Exception e) {
            hijrahDate = HijrahDate.of(minYear, 12, 29);
        }
        HijrahDate firstDate = hijrahDate.with(TemporalAdjusters.firstDayOfYear());
        System.out.println("First date: " + firstDate + " --> " + LocalDate.from(firstDate));

        // ----- Find the last supported date --------
        hijrahDate = HijrahDate.of(maxYear, 1, 1);

        hijrahDate.range(ChronoField.DAY_OF_YEAR);
        HijrahDate lastDate = hijrahDate.with(TemporalAdjusters.lastDayOfYear());
        System.out.println("Last date: " + lastDate + " --> " + LocalDate.from(lastDate));
    }
}
Output:
minYear: 1300
maxYear: 1600
First date: Hijrah-umalqura AH 1300-01-01 --> 1882-11-12
Last date: Hijrah-umalqura AH 1600-12-30 --> 2174-11-25

4. Month Length Example

Exemple : Afficher la durée des mois de quelques années (variante par défaut : calendrier islamique saoudien Umm Al-Qura).
HijrahDate_monthLength_ex1.java
int[] hijrahYears = new int[] { 1441, 1442, 1443, 1444, 1445 };

HijrahDate hijrahDate = HijrahDate.of(hijrahYears[0], 1, 1);
System.out.println("Hijrah Year: " + hijrahYears[0]); // 1441
System.out.println("ISO Year: " + LocalDate.from(hijrahDate).getYear()); // 2019
System.out.println();

for (int month = 1; month <= 12; month++) {
    for (int hijrahYear : hijrahYears) {
        hijrahDate = HijrahDate.of(hijrahYear, month, 1);

        System.out.printf("Year: %s  Month: %s  --> %d%n", hijrahYear, month, hijrahDate.lengthOfMonth());
    }
}
Output:
Year
1441
1442
1443
1444
1445
Month
1
30
29
30
29
29
2
29
30
29
30
30
3
30
29
30
29
30
4
29
30
29
30
30
5
30
29
30
30
29
6
30
30
29
29
30
7
29
29
30
29
29
8
30
30
29
30
29
9
30
30
30
29
30
10
29
29
29
30
29
11
30
30
30
29
29
12
29
29
30
30
30