2016-09-21 118 views

回答

0

关于您的转换示例,在我看来,您正在寻找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解决方案包括

+0

谢谢,这对我非常有帮助。 –

+1

另外,我在这里找到了一个伟大的Umalqura日历库[link](https://github.com/msarhan/ummalqura-calendar) –