java:如何添加天回历日期?

时间:2018-11-08 06:58:38

标签: java jodatime hijri android-jodatime islamic-calendar

我用乔达写:

public static String adjustHijri(String dateHijri, int plusDays) {

    // dateHijri formatted as yyyy-MM-dd, eg: 1440-02-30
    int yearHijri = Integer.parseInt(dateHijri.substring(0, 4));
    int monthHijri = Integer.parseInt(dateHijri.substring(5, 7));
    int dayHijri = Integer.parseInt(dateHijri.substring(8));

    DateTime date = new DateTime(yearHijri, monthHijri, dayHijri, 0, 0, IslamicChronology.getInstance());
    return date.plusDays(plusDays).toString("yyyy-MM-dd");
}

对于dateHijri = 1440-02-30,我得到了:

org.joda.time.IllegalFieldValueException: Value 30 for dayOfMonth must be in the range [1,29]

1 个答案:

答案 0 :(得分:1)

您真正的问题是没有考虑您需要哪种伊斯兰日历。

Hijri 1440年第二个月有30天的期望仅适用于例如沙特阿拉伯的Umalqura日历,但不适用于Joda-Time使用的变体。该库仅支持四种算法变体,请参见APIIslamicChronology.LeapYearPatternType-常量的定义。您的代码隐式使用LEAP_YEAR_16_BASED变量。如果其他三个变体符合您的期望,您可以尝试其他变体(未经我测试),但结果可能是Joda-Time变体都不匹配。如果是这样,那么您对Joda-Time完全不走运,可能需要使用其他库。

由于您已用“ android-jodatime”标记了您的问题,因此我假设并推测您需要在Android上支持umalqura日历。如果是这样,那么您可能会考虑使用第三方{@ {3}}或msarhan(我的库)。 Time4A中的示例:

static final ChronoFormatter<HijriCalendar> HIJRI_FORMAT =
    ChronoFormatter
        .ofPattern("yyyy-MM-dd", PatternType.CLDR, Locale.ROOT, HijriCalendar.family())
        .withCalendarVariant(HijriCalendar.VARIANT_UMALQURA);
public String addDays(String date, int days) throws ParseException {
    HijriCalendar hcal = HIJRI_FORMAT.parse(date).plus(CalendarDays.of(days));
    return HIJRI_FORMAT.format(hcal);
}

如果您仅使用Android 26或更高版本的API级别,则还可以尝试新的java.time.chrono.HijrahDate类,该类也支持umalqura-calendar,但我认为此API级别仍然排除了太多Android用户。而且,Threeten-backport(例如Jake Whartons ThreetenABP库)并不支持umalqura日历。