codestory

Die Anleitung zu Java HijrahDate

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

1. HijrahDate

Die Klasse HijrahDate repräsentiert Daten im Kalendersystem Hijrah, allgemein bekannt als islamischer oder arabischer Kalender, ein Kalendersystem, das auf dem Mondkalender basiert und aus 12 Mondmonaten mit 354 oder 355 Tagen besteht. Es wird verwendet, um islamische Feiertage wie die jährliche Fastenzeit oder das Ereignis Hijrah zu identifizieren.
Der islamische Kalender verwendet die Hijrah-Ära, die dem Jahr 622 des Kalenders Gregorian (auch bekannt als ISO) entspricht. In diesem Jahr wanderten Muhammad und seine Anhänger von Mecca nach Yathrib (heute Medina) aus und gründeten die erste muslimische Gemeinschaft, ein Ereignis, das als Hijrah gefeiert wird. Im Westen wird diese Ära oft als AH (im lateinisch als Anno Hegirae) bezeichnet. In muslimischen Ländern wird es manchmal auch als H bezeichnet. Im Englischen wird die Zeit vor der Hijrah als BH (Before Hijrah) bezeichnet.
Der 1. Januar vom Jahr 1 im Kalender Hijrah, entspricht dem 16. Juli 622. Die folgende Website bietet ein Online-Tool, das Ihnen hilft, Daten im Kalender Hijrah in den Kalender Gregorian umzuwandeln und umgekehrt:
Gregorian (ISO)
Hijrah
622-07-16
1-01-01
2000-01-01
1420-09-24
Year
Ein Jahr im islamischen Kalender hat etwa 354 oder 355 Tage, d.h 11 Tage kürzer als der Kalender Gregorian.
Ungefähre Formel zur Umrechnung des Kalenderjahres Hijrah (AH) in das Kalenderjahr Gregorian (CE) und umgekehrt:
AH = (CE − 622) × 33 ÷ 32

CE = AH + 622 − (AH ÷ 32)
Month
Der islamische Kalender hat 12 Monate mit 29 oder 30 Tagen. Wenn die Mondsichel am Abend des 29. Tages kurz nach Sonnenuntergang sichtbar ist, ist der folgende Tag der erste Tag des neuen Monats. Erfolgt keine Sichtung, wird dem aktuellen Monat ein 30. Tag hinzugefügt, gefolgt vom ersten Tag des Folgemonats
Die traditionelle Version des islamischen Kalenders erfordert, dass eine autorisierte Person oder ein autorisiertes Komitee eine tatsächliche Sichtung der Mondsichel macht, um die Länge jedes Monats zu bestimmen.
Diese Abhängigkeit von astronomischen Beobachtungen macht es schwierig, die Länge der islamischen Monate vorherzusagen. Wolken und andere ungünstige atmosphärische Bedingungen können eine ansonsten sichtbare Mondsichel verdecken. In diesem Fall kann der Monat um einen Tag verlängert werden, wodurch sowohl der Beginn des neuen Monats als auch die damit verbundenen Ereignisse verzögert werden. Aus diesem Grund können sich die Termine für muslimische Feiertage kurzfristig ändern.
Einige Länder und muslimische Gemeinschaften verwenden jetzt modifizierte Versionen des traditionellen Kalenders, die das Timing der islamischen Monate und Feiertage einfacher vorhersagen sollen.
Ein neuer Monat kann auch an verschiedenen Tagen in verschiedenen Ländern beginnen. Da die Monduntergangszeit an einem Ort von seinem Längengrad abhängt, können ein neuer Monat und wichtige religiöse Rituale wie das Fasten im Ramadan beispielsweise in westafrikanischen muslimischen Ländern einen Tag früher beginnen als in Indonesien oder Malaysia.
Namen der Monate im Kalender 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
Namen der Wochentage:
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

Grundsätzlich hat der islamische Kalender viele Variationen, weil viele Länder und viele Sekten ihn verwenden. Die Klasse HijrahDate unterstützt mehrere davon. Wichtig ist, dass Sie Java konfigurieren können, um neue Varianten hinzuzufügen.
Die in Java unterstützte Standardvariante ist "islamic-umalqura" - Saudi-Arabischer Umm Al-Qura Islamischer Kalender. (Weitere Informationen finden Sie in der Klasse HijrahChronology.)
  • Die Anleitung zu Java HijrahChronology
Zum besseren Verständnis analysieren wir das folgende Beispiel (mit der standardmäßigen islamischen Kalendervariante):
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
Der Text, der ein HijrahDate darstellt, besteht aus 3 Teilen:
Chronology ID:
(Chronology Identifier): Ermöglicht die Angabe der zu verwendenden Variante. Die Kalendersysteme Gregorian (ISO) und Japanese haben keine Variation, daher werden diese Informationen nicht angezeigt.
Era Name:
(Era Name): Es wird nur eine Epoche unterstützt, die HijrahEra.AH ist.
Date:
Die Datum Information

3. Supported Range Example

In der Praxis schränkt das Kalendersystem Hijrah zwar den Datumsbereich nicht ein, aber Java unterstützt es nur in geringem Umfang, nämlich:
(**) 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
Das folgende Beispiel wird verwendet, um das kleinste und das größte Datum im von Java unterstützten Hijrah-Kalendersystem zu finden.
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

Beispiel: Schauen Sie die Länge von Monaten von einigen Jahren an (Standardvariante - Der Umm Al-Qura Islamischer Kalender von Saudi Arabien).
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