java : 如何给回历日期加上天数?

java : How to add days to Hijri date?

我使用 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]

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

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

由于您用 "android-jodatime" 标记了您的问题,我假设并推测您需要支持 Android 上的 umalqura 日历。如果是这样,那么您可能会考虑像 msarhan or Time4A(我的库)这样的第 3 方库。 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);
}

如果您只使用 API 级别 Android 26 或更高级别,那么您也可以尝试新的 java.time.chrono.HijrahDate-class,它也支持 umalqura-日历,但我认为这个 API 级别仍然排除了太多 Android 用户。不幸的是,threeten-backport(例如 Jake Whartons ThreetenABP-library)不支持 umalqura 日历。