我正在使用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));
但它给出了相同的结果。
答案 0 :(得分: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);
根据网站islamicfinder.org,日期确实应该是:
星期四8 Raby` al-awal 1435 A.H。
或者看:http://www.ummulqura.org.sa/
我们必须在此记住,Joda Time仅支持基于使用特殊闰年模式的算法计算的伊斯兰日历。总而言之,我知道8种这样的模式。 Joda Time定义了其中的四个。 Joda Time不支持的是沙特阿拉伯的官方日历,即Umalqura日历,这是一个基于目击的日历。总结我们可以说:使用Joda Time是沙特阿拉伯的选择。现在该怎么办?
正如@PopoFibo所提到的,一个选项是使用com.ibm.icu.util.IslamicCalendar
。另一个选项是当前正在等待包含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"
答案 1 :(得分:3)
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更改为MEDIUM
,MEDIUM
则更改输出:
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位。
答案 2 :(得分:1)
Java 8具有出色的功能,即java.time框架。请参阅Tutorial。
这些新课程支持多个calandar,(Hijrah,日语,Minguo,泰国佛教徒),所以每个国家或地区都可以选择他们的特定日历,这个例子很好作为起点
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<Toggle>(){
@Override
public void changed(ObservableValue<? extends Toggle> 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);
}
}
对JavaFX with Chronologie的引用,运行代码的唯一要求是java 8
祝你好运