openplanning

Hướng dẫn và ví dụ Java HijrahDate

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

1. HijrahDate

Lớp HijrahDate đại diện cho ngày tháng trong hệ thống lịch Hijrah, thường được gọi là lịch Hồi Giáo hay lịch Ả Rập. Là một hệ thống lịch dựa trên lịch mặt trăng, bao gồm 12 tháng mặt trăng với 354 hoặc 355 ngày. Nó được sử dụng để xác định các ngày lễ Hồi Giáo, chẳng hạn như khoảng thời gian ăn chay hàng năm hoặc sự kiện Hijrah.
Lịch Hồi Giáo sử dụng kỷ nguyên Hijrah (Hijrah era), tương ứng với năm 622 trong lịch Gregorian (Còn gọi là ISO). Trong năm đó Muhammad và những người theo ông di cư từ Mecca đến Yathrib (nay là Medina) và thành lập cộng đồng Hồi giáo đầu tiên, một sự kiện được kỷ niệm là Hijrah. Ở phương Tây, kỷ nguyên này thường được ký hiệu là AH (Trong tiếng Latinh là Anno Hegirae). Ở các nước Hồi Giáo đôi khi nó cũng được ký hiệu là H. Trong tiếng Anh, thời kỳ trước Hijrah được ký hiệu là BH (Before Hijrah).
Ngày 1 tháng 1 năm 1 trong lịch Hijrah tương ứng với ngày 16 tháng 7 năm 622. Website dưới đây cung cấp một công cụ trực tuyến giúp bạn chuyển đổi ngày tháng trong lịch Hijrah sang lịch Gregorian và ngược lại:
Gregorian (ISO)
Hijrah
622-07-16
1-01-01
2000-01-01
1420-09-24
Year
Một năm trong lịch Hồi Giáo có khoảng 354 hoặc 355 ngày, nghĩa là ngắn hơn 11 ngày so với lịch Gregorian.
Công thức gần đúng để chuyển đổi năm lịch Hijrah (AH) sang năm lịch Gregorian (CE) và ngược lại:
AH = (CE − 622) × 33 ÷ 32

CE = AH + 622 − (AH ÷ 32)
Month
Lịch Hồi giáo có 12 tháng với 29 hoặc 30 ngày. Nếu Mặt Trăng lưỡi liềm có thể nhìn thấy ngay sau khi mặt trời lặn vào tối ngày 29, thì ngày hôm sau là ngày đầu tiên của tháng mới. Nếu không nhìn thấy được thực hiện, ngày thứ 30 được thêm vào tháng hiện tại, sau đó là ngày đầu tiên của tháng tiếp theo.
Phiên bản truyền thống của lịch Hồi giáo yêu cầu người được ủy quyền hoặc ủy ban thực hiện việc nhìn thấy Trăng lưỡi liềm thực tế để xác định độ dài của mỗi tháng.
Sự phụ thuộc vào các quan sát thiên văn này gây khó khăn cho việc dự đoán độ dài của các tháng Hồi giáo. Mây và các điều kiện khí quyển bất lợi khác có thể che khuất Mặt trăng lưỡi liềm có thể nhìn thấy được. Khi điều này xảy ra, tháng có thể bị kéo dài thêm một ngày, làm trì hoãn cả đầu tháng mới và các sự kiện liên quan đến nó. Đây là lý do tại sao ngày cho các ngày lễ của người Hồi giáo có thể thay đổi trong thời gian ngắn.
Một số quốc gia và cộng đồng Hồi giáo hiện sử dụng các phiên bản sửa đổi của lịch truyền thống được thiết kế để giúp dự đoán thời gian của các tháng và quan sát Hồi giáo dễ dàng hơn.
Một tháng mới cũng có thể bắt đầu vào những ngày khác nhau ở các quốc gia khác nhau. Bởi vì thời gian của mặt trăng tại một địa điểm phụ thuộc vào kinh độ của nó , một tháng mới và các nghi lễ tôn giáo quan trọng như lễ ăn chay Ramadan có thể bắt đầu sớm hơn một ngày ở các quốc gia Hồi giáo Tây Phi so với Indonesia hoặc Malaysia .
Tên của các tháng trong lịch 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
Tên của các ngày trong tuần:
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
Xem thêm giải thích về tên gọi của mỗi tháng và ngày trong tuần của hệ thống lịch Hijrah:

2. Basic Example

Về cơ bản, lịch Hồi Giáo có nhiều biến thể, nguyên nhân là có nhiều quốc gia và nhiều giáo phái sử dụng nó. Lớp HijrahDate hỗ trợ một vài biến thể trong số đó, điều quan trọng là Java cho phép bạn cấu hình để thêm các biến thể mới.
Biến thể mặc định được hỗ trợ trong Java"islamic-umalqura" - Lịch Hồi Giáo Umm Al-Qura của Ả Rập Xê Út. (Xem thêm lớp HijrahChronology để hiểu chi tiết hơn).
  • Hướng dẫn và ví dụ Java HijrahChronology
Để dễ hiểu chúng ta phân tích ví dụ dưới đây (Sử dụng biến thể lịch Hồi Giáo mặc định):
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
Văn bản đại diện cho một HijrahDate bao gồm 3 phần:
Chronology ID:
(Định danh niên đại): Cho phép chỉ định biến thể để sử dụng. Các hệ thống lịch Gregorian (ISO)Japanese không có biến thể vì vậy thông tin này không xuất hiện.
Era Name:
(Tên kỷ nguyên): Chỉ duy nhất một kỷ nguyên được hỗ trợ đó là HijrahEra.AH.
Date:
Thông tin ngày tháng.

3. Supported Range Example

Mặc dù trong thực tế hệ thống lịch Hijrah là không giới hạn phạm vi ngày tháng, nhưng Java chỉ hỗ trợ nó trong phạm vi nhỏ, cụ thể là:
(**) 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
Ví dụ dưới đây được sử dụng để tìm ngày nhỏ nhất và lớn nhất trong hệ thống lịch Hijrah được Java hỗ trợ.
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

Ví dụ: Xem độ dài các tháng của một vài năm (Biến thể mặc định - Lịch Hồi Giáo Umm Al-Qura của Ả Rập Xê Út).
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