2

使用 Joda 我写:

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]
4

1 回答 1

3

你真正的问题是没有考虑过你需要哪种伊斯兰历法。

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

由于您已使用“android-jodatime”标记您的问题,我假设并推测您需要支持 Android 上的 umalqura 日历。如果是这样,那么您可能会考虑像msarhanTime4A(我的库)这样的 3rd-party 库。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-class 也支持 umalqura-calendar 但我认为这个 API 级别仍然排除了太多的 Android 用户。不幸的是,threeten-backport(例如 Jake Whartons ThreetenABP-library)不支持 umalqura 日历)。

于 2018-11-09T04:56:01.003 回答