我正在開發一個需要Hijri日期的應用程序,我使用了這裏發佈的converting gregorian to hijri date。錯誤的從公曆轉換到Hijri日期(Android Studio)
它適用於我,但它給了錯誤的日期,例如當Gregorian是20/9/2016變成17/12/1437在Hijri,這是錯誤的,它應該是19/12/1437。
問題在哪裏?
我正在開發一個需要Hijri日期的應用程序,我使用了這裏發佈的converting gregorian to hijri date。錯誤的從公曆轉換到Hijri日期(Android Studio)
它適用於我,但它給了錯誤的日期,例如當Gregorian是20/9/2016變成17/12/1437在Hijri,這是錯誤的,它應該是19/12/1437。
問題在哪裏?
關於您的轉換示例,在我看來,您正在尋找Hijri日曆的Umalqura變體,這是沙特阿拉伯的官方日曆。
您發佈的SO-link指的是Joda-Time。該庫不支持umalqura,但Hijri日曆的四種算法變體(僅適用於近似)。我測試了所有四種支持的變體。沒有什麼是你的。
Chronology iso = ISOChronology.getInstanceUTC();
Chronology hijri =
IslamicChronology.getInstance(DateTimeZone.UTC, IslamicChronology.LEAP_YEAR_INDIAN);
LocalDate todayIso = new LocalDate(2016, 9, 20, iso);
LocalDate todayHijri = new LocalDate(todayIso.toDateTimeAtStartOfDay(), hijri);
System.out.println("joda=" + todayHijri);
// LEAP_YEAR_15_BASED => 1437-12-16
// LEAP_YEAR_16_BASED => 1437-12-16
// LEAP_YEAR_HABASH_AL_HASIB => 1437-12-17
// LEAP_YEAR_INDIAN => 1437-12-17
如果您在Java的8 -platform操作,那麼您可以採用如下方案。但是,如果您是在Android和嘗試使用反向移植ThreetenABP那麼就會失敗,因爲它的實現從Java-8偏差:
HijrahDate hd = HijrahDate.from(LocalDate.of(2016, 9, 20));
System.out.println("java.time=" + hd); // Hijrah-umalqura AH 1437-12-19
如果你想要像其他變體或一天的變量開始更多的日曆功能(伊斯蘭日子從日落開始!)或者如果您在Android上運行,那麼您可以使用我的庫Time4J/A。該HijriCalendar of Time4J(或Time4A在Android)得到你想要的東西:
System.out.println(
PlainDate.of(2016, 9, 20)
.transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA));
// AH-1437-12-19[islamic-umalqura]
注意最後一個例子是在中午時有效轉換。當使用黃昏作爲一天的開始時,請諮詢javadoc如何做到這一點。
從2016年9月7日更新:Android上非常不同的API
其他可能umalqura解決方案包括
謝謝,這對我非常有幫助。 –
另外,我在這裏找到了一個偉大的Umalqura日曆庫[link](https://github.com/msarhan/ummalqura-calendar) –