无法获得正确的当前伊斯兰日期

Mah*_*leh 7 java jodatime

我正在使用joda时间在沙特阿拉伯获得当前的伊斯兰日期,如同他们的网站:

DateTime dtISO = new DateTime(2014, 1, 9, 0, 0, 0, 0);
DateTime dtIslamic = dtISO.withChronology(IslamicChronology.getInstance());
Run Code Online (Sandbox Code Playgroud)

上面打印的日期少于实际日期,它打印今天是7但实际是8.请告知.

更新:

我甚至用时区尝试了如下:

DateTimeZone SAUDI_ARABIA = DateTimeZone.forID("Asia/Riyadh");
DateTime dtISO = new DateTime(2014, 1, 9, 0, 0, 0, 0);
DateTime dtIslamic = dtISO.withChronology(IslamicChronology.getInstance(SAUDI_ARABIA));
Run Code Online (Sandbox Code Playgroud)

但它给出了相同的结果.

Men*_*ild 4

首先,我尝试了 JodaTime 的“闰年模式”。所有四个定义的模式都会产生相同的结果,即日期“Hijrah 1435-03-07”。这是我的测试代码:

DateTime dtISO = new DateTime(2014, 1, 9, 0, 0, 0, 0);
DateTimeZone tzSAUDI_ARABIA = DateTimeZone.forID("Asia/Riyadh");
DateTime dtIslamic = 
  dtISO.withChronology(
    IslamicChronology.getInstance(
      tzSAUDI_ARABIA, 
      IslamicChronology.LEAP_YEAR_15_BASED));
System.out.println(dtIslamic);
Run Code Online (Sandbox Code Playgroud)

根据 islamicfinder.org 网站,日期确实应该是:

星期四 8 Raby` al-awal 伊斯兰历 1435

或者参见: http: //www.ummulqura.org.sa/

我们必须记住,Joda Time 仅支持基于使用特殊闰年模式的算法计算的伊斯兰日历。我总共知道 8 种这样的模式。Joda Time 定义了其中四个。Joda Time 不支持沙特阿拉伯的官方日历,即 Umalqura 日历,这是一种基于目击的日历。因此,作为总结,我们可以说:使用乔达时间对于沙特阿拉伯来说不是选择。现在做什么?

一种选择是使用com.ibm.icu.util.IslamicCalendar@PopoFibo 提到的。另一个选项当前是等待 Java 8,其中包含 Umalqura 日历,这与 IBM 版本不同。详细信息:虽然 IBM 版本仍然基于计算(“天文”(不是真正的)或“民用”),但该类java.time.chrono.HijrahDate使用后台查找表,其中包含沙特阿拉伯机构 KACST 提供的数据。我会比 IBM 版本更信任这个版本,因为对于其他日期 IBM(这里是其库 ICU4J)不一定是正确的。所以在 Java 8 中你可以使用:

HijrahDate hdate = 
  HijrahChronology.INSTANCE.date(LocalDate.of(2014, Month.JANUARY, 9));
System.out.println(hdate); // Output: "Hijrah-umalqura AH 1435-03-08"
Run Code Online (Sandbox Code Playgroud)