Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';无法获得正确的当前伊斯兰日期_Java_Jodatime - Fatal编程技术网

Java Can';无法获得正确的当前伊斯兰日期

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

我正在使用joda time获取沙特阿拉伯当前的伊斯兰日期,如他们的网站所示:

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