Java Can';无法获得正确的当前伊斯兰日期
我正在使用joda time获取沙特阿拉伯当前的伊斯兰日期,如他们的网站所示:Java Can';无法获得正确的当前伊斯兰日期,java,jodatime,Java,Jodatime,我正在使用joda time获取沙特阿拉伯当前的伊斯兰日期,如他们的网站所示: DateTime dtISO = new DateTime(2014, 1, 9, 0, 0, 0, 0); DateTime dtIslamic = dtISO.withChronology(IslamicChronology.getInstance()); 上面打印的日期比实际日期少,它打印的是今天是7,但实际是8。 请告知 更新: 我甚至尝试了时区,如下所示: DateTimeZone SAUDI_ARABI
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));
但它给出了同样的结果。乔达似乎没有改变民用和天文时代的规定。正如我从参考资料中看到的,根据民用纪元,今天是第7天,每天文纪元是第8天
com.ibm.icu.util.IslamicCalendar
可能会为您完成这项工作;它有一个用于civil epoch的显式布尔值,可以设置为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()));
输出:
35年3月8日9:50:30下午
如果我将DateFormat更改为MEDIUM
,MEDIUM
则会更改输出:
System.out.println(calendar.getDateTimeFormat(DateFormat.MEDIUM, DateFormat.MEDIUM, new Locale("en")).format(new Date()));
更改的输出:
拉比?I 814359:51:58下午
我对UTI没有太多的经验,因此无法准确解释上述结果,但希望上述内容能帮助您的事业
不用说,
setCivil(true)
将日期设置为7号。首先,我尝试了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拉比阿瓦尔1435 A.H
或参阅:
我们必须记住,约达时间只支持基于算法计算的伊斯兰历法,使用特殊的闰年模式。总而言之,我知道有8种这样的模式。乔达时间定义了其中的四个。Joda Time不支持的是沙特阿拉伯的官方日历,即Umalqura日历,这是一种基于视觉的日历。总之,我们可以说:使用约达时间对沙特阿拉伯来说是没有选择的。现在该怎么办
一个选项是使用@PopoFibo提到的com.ibm.icu.util.IslamicCalendar
。另一个选项当前正在等待Java8,它包含Umalqura日历,与IBM版本不同,它不是必需的。详细说明:尽管IBM版本仍然基于计算(无论是“天文”(不是真正的)还是“民用”),但类java.time.chrono.HijrahDate
使用了一个后台查找表,其中包含沙特阿拉伯机构KACST提供的数据。我更相信这个版本,因为对于其他日期,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"
java.time
Java8提供了一个出色的特性,即框架。看
这些新类支持多个calandar(Hijrah、Japanese、Minguo、Thai Pharman),因此每个国家或地区都可以选择自己的特定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<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\u日期选择器;
导入java.time.LocalDate;
导入java.time.chrono.Chronology;
导入java.time.chrono.hijrah年表;
导入java.time.chrono.IsoChronology;
导入java.time.chrono.JapaneseChronology;
导入java.time.chrono.minguo年表;
导入java.time.chrono.ThaiBuddhistChronology;
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.event;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.DatePicker;
导入javafx.scene.control.RadioButton;
导入javafx.scene.control.Toggle;
导入javafx.scene.control.ToggleGroup;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类JavaFX_日期选择器扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
//现在有新的数据选择器初始化
DatePicker DatePicker=新的日期选择器();
datePicker.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(事件){
LocalDate=datePicker.getValue();
System.err.println(“所选日期:“+日期”);
}
});
//现在重新加载日期选择器
按钮btnNow=新按钮(“现在”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(事件){
setValue(LocalDate.now());
}
});
final ToggleGroup groupChronology=新ToggleGroup();
RadioButton optDefault=新RadioButton(“默认”);
optDefault.setToggleGroup(组时间顺序);
optDefault.setSelected(真);
optDefault.setUserData(null);
RadioButton optHijrah=新RadioButton(“Hijrah年表”);
optHijrah.setToggleGroup(组年表);
setUserData(hijrahromology.INSTANCE);
RadioButton optIso=新的RadioButton(“等时学”);
optIso.setToggleGroup(组时间顺序);
setUserData(IsoChronology.INSTANCE);
RadioButton optJapanese=新的RadioButton(“日本技术”);
optJapanese.setToggleGroup(组年表);
setUserData(JapaneseChronology.INSTANCE);
RadioButton optMinguo=新的RadioButton(“Minguo年表”);
optMinguo.setToggleGroup(组年表);
optMinguo.setUserData(minguoEromology.INSTANCE);
RadioButton opthaiframan=新的RadioButton(“ThaiBuddHist年表”);
optthai.setToggleGroup(组年表);
setUserData(ThaiBuddhistChronology.INSTANCE);
groupChronology.selectedToggleProperty().addListener(新的ChangeListener()){
@凌驾
更改公众假期(Observalevalue您考虑过您的时区吗?@Elliott Frisch,是的,并用代码更新了问题,它给出了相同的结果。这是一个非常详细的解释,非常有用!Java 8中的这些更改是JSR 310的一部分?@Meno Hochschild,感谢您的非常详细的解释,但是com.ibm.icu.util.IslamicCalendar与旧日期有问题,请参阅我的ab。)ove注释。@PopoFibo是的,我提供的新Java 8代码是JSR 310的一部分。@MahmoudS,我没有ICU4