错误的从公历转换到Hijri日期(Android Studio)
问题描述:
我正在开发一个需要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解决方案包括
- Android developer preview 24(谷歌似乎开始包括ICU4J)
- Calendar-adaptation of msarhan(由于OP的评论,该库支持两种语言阿拉伯语和英文月份名称)
谢谢,这对我非常有帮助。 –
另外,我在这里找到了一个伟大的Umalqura日历库[link](https://github.com/msarhan/ummalqura-calendar) –