在 Java 中將公曆日期轉換為回曆日期
1. 概述
公曆和回曆代表兩種不同的時間測量系統。
在本教程中,我們將了解將公曆日期轉換為回曆日期的各種方法。
2. 公曆與回曆
讓我們來了解一下公曆和回曆之間的差異。公曆遵循太陽年,由 12 個月組成,長度固定。回曆遵循農曆年,有 12 個月,29 天和 30 天交替。
在回曆中,每個月的長度取決於月球繞地球一週的週期。公曆有 365 或 366 天,而回曆有 354 或 355 天。這意味著回曆年比公曆年短約 11 天。
3. 使用HijrahDate
類
在這種方法中,我們將使用java.time.chrono
套件中的HijrahDate
類別。 Java 8 中引入了此類,用於現代日期和時間操作。它提供了多種方法來建立和操作回曆日期。
3.1.使用from()
方法
我們將使用the HijrahDate
類別的the from()
方法將日期從公曆轉換為回曆。此方法將表示公曆日期的LocalDate
物件作為輸入並傳回HijriDate
物件:
public HijrahDate usingFromMethod(LocalDate gregorianDate) {
return HijrahDate.from(gregorianDate);
}
現在,讓我們執行測試:
void givenGregorianDate_whenUsingFromMethod_thenConvertHijriDate() {
LocalDate gregorianDate = LocalDate.of(2013, 3, 31);
HijrahDate hijriDate = GregorianToHijriDateConverter.usingFromMethod(gregorianDate);
assertEquals(1434, hijriDate.get(ChronoField.YEAR));
assertEquals(5, hijriDate.get(ChronoField.MONTH_OF_YEAR));
assertEquals(19, hijriDate.get(ChronoField.DAY_OF_MONTH));
}
3.2.使用HijrahChronology
類
在這種方法中,我們將使用the java.time.chrono.HijrahChronology
類,它代表 Hijri(伊斯蘭)日曆系統。
HijrahChoronology.INSTANCE
方法創建 Hijri 日曆系統的例子。我們將使用它來建立ChronoLocalDate
對象,以將公曆日期轉換為回曆日期:
public HijrahDate usingHijrahChronology(LocalDate gregorianDate) {
HijrahChronology hijrahChronology = HijrahChronology.INSTANCE;
ChronoLocalDate hijriChronoLocalDate = hijrahChronology.date(gregorianDate);
return HijrahDate.from(hijriChronoLocalDate);
}
現在,讓我們測試一下這種方法:
void givenGregorianDate_whenUsingHijrahChronologyClass_thenConvertHijriDate() {
LocalDate gregorianDate = LocalDate.of(2013, 3, 31);
HijrahDate hijriDate = GregorianToHijriDateConverter.usingHijrahChronology(gregorianDate);
assertEquals(1434, hijriDate.get(ChronoField.YEAR));
assertEquals(5, hijriDate.get(ChronoField.MONTH_OF_YEAR));
assertEquals(19, hijriDate.get(ChronoField.DAY_OF_MONTH));
}
4. 使用Joda-Timе
Joda-Timе
是一個流行的 Java 日期和時間操作庫,提供了標準 Java 日期和時間 API 的替代方案,具有更直覺的介面。
在Joda-Time,
IslamicChronology
類代表 Hijri(伊斯蘭)日曆。我們將使用DateTime's withChronology()
方法和IslamicChornology
實例將公曆日期轉換為回曆日期:
public DateTime usingJodaDate(DateTime gregorianDate) {
return gregorianDate.withChronology(IslamicChronology.getInstance());
}
現在,讓我們測試一下這種方法:
void givenGregorianDate_whenUsingJodaDate_thenConvertHijriDate() {
DateTime gregorianDate = new DateTime(2013, 3, 31, 0, 0, 0);
DateTime hijriDate = GregorianToHijriDateConverter.usingJodaDate(gregorianDate);
assertEquals(1434, hijriDate.getYear());
assertEquals(5, hijriDate.getMonthOfYear());
assertEquals(19, hijriDate.getDayOfMonth());
}
5. 使用UmmalquraCalendar
類
[ummalqura-calendar](https://github.com/msarhan/ummalqura-calendar)
庫具有UmmalquraCalendar
類,該類派生自 Java 8。要包含ummalqura-calendar
庫,我們需要添加以下依賴項:
<dependency>
<groupId>com.github.msarhan</groupId>
<artifactId>ummalqura-calendar</artifactId>
<version>2.0.2</version>
</dependency>
我們將使用其setTime()
方法來執行公曆日期到回曆日期的轉換:
public UmmalquraCalendar usingUmmalquraCalendar(GregorianCalendar gregorianCalendar) throws ParseException {
UmmalquraCalendar hijriCalendar = new UmmalquraCalendar();
hijriCalendar.setTime(gregorianCalendar.getTime());
return hijriCalendar;
}
現在,讓我們測試一下這種方法:
void givenGregorianDate_whenUsingUmmalquraCalendar_thenConvertHijriDate() throws ParseException {
GregorianCalendar gregorianCalenar = new GregorianCalendar(2013, Calendar.MARCH, 31);
UmmalquraCalendar ummalquraCalendar = GregorianToHijriDateConverter.usingUmmalquraCalendar(gregorianCalenar);
assertEquals(1434, ummalquraCalendar.get(Calendar.YEAR));
assertEquals(5, ummalquraCalendar.get(Calendar.MONTH) + 1);
assertEquals(19, ummalquraCalendar.get(Calendar.DAY_OF_MONTH));
}
六,結論
在本教程中,我們討論了將公曆日期轉換為回曆日期的各種方法。
與往常一樣,範例中使用的程式碼可以在 GitHub 上找到。