Hướng dẫn và ví dụ Java HijrahDate
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.
- JapaneseDate
- MinguoDate
- ThaiBuddhistDate
- LocalDate
- LocalDate
- Temporal
- TemporalAdjuster
- TemporalAccessor
- ChronoLocalDate
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 là "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) và 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 |
Các hướng dẫn Java Date Time
- Hướng dẫn và ví dụ Java ZoneId
- Hướng dẫn và ví dụ Java Temporal
- Hướng dẫn và ví dụ Java Period
- Hướng dẫn và ví dụ Java TemporalAdjusters
- Hướng dẫn và ví dụ Java MinguoDate
- Hướng dẫn và ví dụ Java TemporalAccessor
- Hướng dẫn và ví dụ Java JapaneseEra
- Hướng dẫn và ví dụ Java HijrahDate
- UTC, UT và GMT là gì?
- Hướng dẫn và ví dụ Date Time trong Java
- Giờ Tiết kiệm ánh sáng ban ngày (DST) là gì?
- Hướng dẫn và ví dụ Java LocalDate
- Hướng dẫn và ví dụ Java LocalTime
- Hướng dẫn và ví dụ Java LocalDateTime
- Hướng dẫn và ví dụ Java ZonedDateTime
- Hướng dẫn và ví dụ Java ZoneOffset
- Hướng dẫn và ví dụ Java JapaneseDate
- Hướng dẫn và ví dụ Java Duration
- Hướng dẫn và ví dụ Java TemporalQuery
- Hướng dẫn và ví dụ Java TemporalAdjuster
- Hướng dẫn và ví dụ Java ChronoUnit
- Hướng dẫn và ví dụ Java TemporalQueries
Show More
- Các hướng dẫn Java Web Services
- Hướng dẫn lập trình Java Servlet/JSP
- Các hướng dẫn lập trình JavaFX
- Các hướng dẫn lập trình Java SWT
- Các hướng dẫn Java Oracle ADF
- Java cơ bản
- Các hướng dẫn Java Collections Framework
- Các hướng dẫn Java IO
- Các hướng dẫn Struts2 Framework
- Các hướng dẫn Spring Boot
- Các hướng dẫn Spring Cloud
- Các hướng dẫn Maven
- Các hướng dẫn Gradle