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

时间:2014-01-09 15:09:24

标签: java jodatime

我正在使用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));

但它给出了相同的结果。

3 个答案:

答案 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)

乔达似乎没有改变民用和天文时代的条款。正如我从参考文献中看到的那样,根据民用时代,它是今天的第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位。

答案 2 :(得分:1)

java.time

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

祝你好运