我正在开发一款需要Hijri Date的应用,我使用了converting gregorian to hijri date发布的内容。
它适用于我,但它给出了错误的日期,例如当Gregorian是2016年2月20日它成为17/12/1437 IN Hijri时,这应该是19/12/1437。
问题出在哪里?
答案 0 :(得分:0)
关于你的转换示例,在我看来,你正在寻找Hijri日历的Umalqura变体,这是沙特阿拉伯的官方日历。
您发布的SO链接指的是 Joda-Time 。该库不支持umalqura,但 Hijri-calendar的四种算法变体(仅适用于近似值)。我测试了所有四种支持的变体。没有人适合你。
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 (或Android上的Time4A)会产生您想要的内容:
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解决方案包括