从公历转换为回历日期时出错 (Android Studio)

Wrong in Converting from Gregorian to Hijri Date (Android Studio)

我正在开发一个需要回历日期的应用程序,我使用了此处发布的内容 converting gregorian to hijri date

它对我有用,但它给出了错误的日期,例如公历是 20/9/2016,它变成了回历 17/12/1437,这是错误的,它应该是 19/12/1437。

问题出在哪里?

关于您的转换示例,在我看来您正在寻找 Hijri-calendar 的 Umalqura 变体,它是沙特阿拉伯的官方日历。

您发布的SO-link指的是Joda-Time。该库不支持 umalqura,但 回历的四种算法变体(仅适用于近似值)。我已经测试了所有四种支持的变体。 None 适合你。

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平台上操作,那么您可以使用以下解决方案。但是,如果您在 Android 上并尝试使用 backport 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 (or Time4A on Android) 产生你想要的:

System.out.println(
  PlainDate.of(2016, 9, 20)
    .transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA)); 
// AH-1437-12-19[islamic-umalqura]

请注意,最后一个示例是在中午有效的转换。当使用晚上作为一天的开始时,请参考 javadoc 如何做到这一点。

2016-09-07 更新:

Android 上具有非常不同的 API 的其他可能的 umalqura 解决方案包括