我正在开发一个需要回历日期的应用程序,我使用了此处发布的内容将 gregorian 转换为回历日期。
它对我有用,但它给出了错误的日期,例如当公历是 20/9/2016 时它变成了 17/12/1437 IN Hijri,这是错误的,它应该是 19/12/1437。
问题出在哪里 ?
我正在开发一个需要回历日期的应用程序,我使用了此处发布的内容将 gregorian 转换为回历日期。
它对我有用,但它给出了错误的日期,例如当公历是 20/9/2016 时它变成了 17/12/1437 IN Hijri,这是错误的,它应该是 19/12/1437。
问题出在哪里 ?
关于您的转换示例,在我看来,您正在寻找回历日历的 Umalqura 变体,这是沙特阿拉伯的官方日历。
您发布的 SO-link 指的是Joda-Time。该库不支持 umalqura,但支持回历日历的四种算法变体(仅适合作为近似值)。我已经测试了所有四种支持的变体。没有一个适合你。
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。Time4J(或Android 上的Time4A)的 HijriCalendar 会产生您想要的结果:
System.out.println(
PlainDate.of(2016, 9, 20)
.transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA));
// AH-1437-12-19[islamic-umalqura]
请注意,最后一个示例是在中午有效的转换。当使用晚上作为一天的开始时,请查阅 javadoc 如何做到这一点。
2016 年 9 月 7 日更新:
其他可能的 umalqura 解决方案在 Android 上具有非常不同的 API,包括