openplanning

Hướng dẫn sử dụng Java HijrahDate

Xem thêm các chuyên mục:

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 ngày sự kiện Hijri.
Lịch Hồi Giáo sử dụng kỷ nguyên Hijri (Hijri 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à Hijri. Ở 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 Hijri được ký hiệu là BH (Before Hijri).
Ngày 1 tháng 1 năm 1 trong lịch Hijri 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 Hijri sang lịch Gregorian và ngược lại:
Gregorian (ISO) Hijri
622-07-16 1-01-01
2000-01-01 1420-09-24

Year

Một năm trong lịch Hồi Giáo gồm 12 tháng, mỗi tháng có 29 hoặc 30 ngày. Một năm 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 Hijri (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 Hijri:
Months ISO Months Hijri 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 Hijri 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 Hijri:

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).
  • TODO Link?
Để 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:
  1. Chronology ID (ID niên đại): Tương ứng với định danh biến thể của hệ thống lịch Hijri. Các hệ thống lịch Gregorian (ISO) hoặc Japanese không có biến thể vì vậy thông tin này không xuất hiện.
  2. Era Name (Tên kỷ nguyên): Chỉ duy nhất một kỷ nguyên được hỗ trợ đó là HijrahEra.AH.
  3. Date: Thông tin ngày tháng.

3- Supported Range Example

Mặc dù trong thực tế hệ thống lịch Hijri 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 Hijir đượ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 mỗi tháng trong một vài năm gần đây (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

Xem thêm các chuyên mục:

Có thể bạn quan tâm

Đây là các khóa học trực tuyến bên ngoài website o7planning mà chúng tôi giới thiệu, nó có thể bao gồm các khóa học miễn phí hoặc giảm giá.