java.time.DateTimeException:Hijrah日期超出范围

java.time.DateTimeException:Hijrah日期超出范围,java,Java,今天我发现了Java的8个Hijrah日期,我正在尝试将Hijri日期转换为公历日期;我一直收到这个错误: java.time.DateTimeException:Hijrah日期超出范围 String repayDate = date.substring(0, 4)+"-"+date.substring(4, 6)+"-"+date.substring(6, 8); DateFormat dateFormat = new SimpleDateFormat("yyyy-M

今天我发现了Java的8个Hijrah日期,我正在尝试将Hijri日期转换为公历日期;我一直收到这个错误:

java.time.DateTimeException:Hijrah日期超出范围

    String repayDate = date.substring(0, 4)+"-"+date.substring(4, 6)+"-"+date.substring(6, 8);
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date inputDate = dateFormat.parse(repayDate);
        Calendar cl=Calendar.getInstance();
        cl.setTime(inputDate);


        HijrahDate hDate=    HijrahChronology.INSTANCE.date(LocalDate.of(cl.get(1),cl.get(Calendar.MONTH)+1, cl.get(Calendar.DATE))); 


        return IsoChronology.INSTANCE.date(hDate).toString() ;

日期的内容为:1400-01-01


谢谢

根本不需要使用
日期格式
日历
——如果可以使用Java时间API,应该避免使用传统API

下面是一个简单的例子,可以“使用”您的输入:

String date = "14000101";

TemporalAccessor ta = DateTimeFormatter.ofPattern("uuuuMMdd")
                                       .withChronology(HijrahChronology.INSTANCE)
                                       .parse(date);
HijrahDate hDate = HijrahDate.from(ta);

System.out.println("hDate = " + hDate);
System.out.println("Gregorian date = " + IsoChronology.INSTANCE.date(hDate).toString());

根本不需要使用
日期格式
日历
——如果可以使用Java时间API,则应避免使用传统API

下面是一个简单的例子,可以“使用”您的输入:

String date = "14000101";

TemporalAccessor ta = DateTimeFormatter.ofPattern("uuuuMMdd")
                                       .withChronology(HijrahChronology.INSTANCE)
                                       .parse(date);
HijrahDate hDate = HijrahDate.from(ta);

System.out.println("hDate = " + hDate);
System.out.println("Gregorian date = " + IsoChronology.INSTANCE.date(hDate).toString());

您可以手动解析输入日期,然后根据它创建一个Hijrah日期,并将其转换为如下所示的公历

public static LocalDate hijrahToGregorian(String input){
    int year = Integer.parseInt(input.substring(0,4));
    int month = Integer.parseInt(input.substring(4,6));
    int day = Integer.parseInt(input.substring(6,8));

    HijrahDate hijrah = HijrahDate.of(year, month, day);
    return IsoChronology.INSTANCE.date(hijrah);
}

您可以手动解析输入日期,然后根据它创建一个Hijrah日期,并将其转换为如下所示的公历

public static LocalDate hijrahToGregorian(String input){
    int year = Integer.parseInt(input.substring(0,4));
    int month = Integer.parseInt(input.substring(4,6));
    int day = Integer.parseInt(input.substring(6,8));

    HijrahDate hijrah = HijrahDate.of(year, month, day);
    return IsoChronology.INSTANCE.date(hijrah);
}


为什么要使用日期格式和日历呢
LocalDate.parse(returndate)
可以很好地工作。
date
的内容是什么?date的内容是:1400-01-01所以您试图将Gregorian 1400 CE转换为Hijra?或者试图将希吉拉1穆哈拉姆1400 AH转换为格里高利?这真的是日期的内容吗?它应该是
14000101
。为什么要使用日期格式和日历
LocalDate.parse(returndate)
可以很好地工作。
date
的内容是什么?date的内容是:1400-01-01所以您试图将Gregorian 1400 CE转换为Hijra?或者试图将希吉拉1穆哈拉姆1400 AH转换为格里高利?这真的是日期的内容吗?这应该是
14000101
“您可以手动解析输入日期”相当危险,因为OP甚至不知道如何正确设置其
输入的
字符串的格式。他会用他现有的“1400-01-01”来尝试你的方法,这对你的代码来说不太好。@Tom true,但如果你不知道输入日期格式是什么,那么没有其他方法会更好。你可以验证它或期望其他方法,比如三个int参数。当然,但这超出了问题的范围。OP想知道如何进行转换。你的答案仍然可以告诉他你期望的字符串格式(我知道与OPs代码相同,但他已经使用了不正确的格式)。“你可以手动解析输入日期”非常危险,因为OP甚至不知道如何正确格式化他的
输入
字符串。他会用他现有的“1400-01-01”来尝试你的方法,这对你的代码来说不太好。@Tom true,但如果你不知道输入日期格式是什么,那么没有其他方法会更好。你可以验证它或期望其他方法,比如三个int参数。当然,但这超出了问题的范围。OP想知道如何进行转换。你的答案仍然可以告诉他你期望的字符串格式(与OPs代码相同,我知道,但他已经使用了不正确的格式)。这是正确的方法。我的答案不如这个。这是正确的方法。我的回答不如这个。