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

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

DateTime dtISO = new DateTime(2014, 1, 9, 0, 0, 0, 0); DateTime dtIslamic = dtISO.withChronology(IslamicChronology.getInstance()); 

上面打印的日期少于实际日期,它打印今天是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)); 

但它给出了相同的结果。

首先,我尝试了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); 

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

星期四8 Raby` al-awal 1435 AH

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

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

一个选项是使用com.ibm.icu.util.IslamicCalendar正如@PopoFibo所提到的那样。 另一个选项是当前正在等待包含Umalqura日历的Java 8,它不一定与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" 

乔达似乎没有改变民用和天文时代的规定。 正如我从参考文献中看到的那样,根据民间时代,它是今天的第7天和每天的第8天。

com.ibm.icu.util.IslamicCalendar可能会为你做这个工作; 它有一个明确的民用纪元布尔值,可以设置为false

 IslamicCalendar calendar = new IslamicCalendar(TimeZone.getTimeZone("Asia/Riyadh")); calendar.setCivil(false); System.out.println(calendar.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM, new Locale("en")).format(new Date())); 

输出:

3/8/35 9:50:30 PM

如果我将DateFormat更改为MEDIUMMEDIUM会更改输出:

 System.out.println(calendar.getDateTimeFormat(DateFormat.MEDIUM, DateFormat.MEDIUM, new Locale("en")).format(new Date())); 

改变输出:

拉比? I 8,1435 9:51:58 PM

我没有太多使用util的经验,因此无法准确地解释上述结果,但希望上述内容有助于您的事业。

不用说setCivil(true)将日期设置为7。

java.time

Java 8具有出色的function,即java.time框架。 请参阅教程 。

这些新课程支持多个calandar(Hijrah,日语,Minguo,泰国佛教徒),所以每个国家或地区都可以选择他们的特定calander,这个例子很好作为起点

 package javafx_datepicker; import java.time.LocalDate; import java.time.chrono.Chronology; import java.time.chrono.HijrahChronology; import java.time.chrono.IsoChronology; import java.time.chrono.JapaneseChronology; import java.time.chrono.MinguoChronology; import java.time.chrono.ThaiBuddhistChronology; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.DatePicker; import javafx.scene.control.RadioButton; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class JavaFX_DatePicker extends Application { @Override public void start(Stage primaryStage) { //New DataPicker init at now DatePicker datePicker = new DatePicker(); datePicker.setOnAction(new EventHandler() { @Override public void handle(Event event) { LocalDate date = datePicker.getValue(); System.err.println("Selected date: " + date); } }); //reload datePicker at now Button btnNow = new Button("Now"); btnNow.setOnAction(new EventHandler() { @Override public void handle(Event event) { datePicker.setValue(LocalDate.now()); } }); final ToggleGroup groupChronology = new ToggleGroup(); RadioButton optDefault = new RadioButton("default"); optDefault.setToggleGroup(groupChronology); optDefault.setSelected(true); optDefault.setUserData(null); RadioButton optHijrah = new RadioButton("HijrahChronology"); optHijrah.setToggleGroup(groupChronology); optHijrah.setUserData(HijrahChronology.INSTANCE); RadioButton optIso = new RadioButton("IsoChronology"); optIso.setToggleGroup(groupChronology); optIso.setUserData(IsoChronology.INSTANCE); RadioButton optJapanese = new RadioButton("JapaneseChronology"); optJapanese.setToggleGroup(groupChronology); optJapanese.setUserData(JapaneseChronology.INSTANCE); RadioButton optMinguo = new RadioButton("MinguoChronology"); optMinguo.setToggleGroup(groupChronology); optMinguo.setUserData(MinguoChronology.INSTANCE); RadioButton optThaiBuddhist = new RadioButton("ThaiBuddhistChronology"); optThaiBuddhist.setToggleGroup(groupChronology); optThaiBuddhist.setUserData(ThaiBuddhistChronology.INSTANCE); groupChronology.selectedToggleProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue observable, Toggle oldValue, Toggle newValue) { if (groupChronology.getSelectedToggle() != null) { datePicker.setChronology( (Chronology)groupChronology.getSelectedToggle().getUserData()); }else{ datePicker.setChronology(null); } } }); VBox vBox = new VBox(); vBox.getChildren().addAll(optDefault, optHijrah, optIso, optJapanese, optMinguo, optThaiBuddhist, btnNow, datePicker); StackPane root = new StackPane(); root.getChildren().add(vBox); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("java-buddy.blogspot.com"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

使用Chronologie引用JavaFX,运行代码的唯一要求是java 8

祝好运