使用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");
}
对于日期Hijri=1440-02-30我得到:
org.joda.time.IllegalFieldValueException: Value 30 for dayOfMonth must be in the range [1,29]
你真正的问题是没有考虑到你需要哪种伊斯兰日历。
1440年回历第二个月有30天的预期仅适用于沙特阿拉伯的乌玛勒库拉日历,但不适用于乔达时间使用的变体。该库只支持四种算法变体,请参阅API中IslamicChronology.LeapYearPatternType
常量的定义。您的代码隐式地使用LEAP_YEAR_16_BASED
-变体。如果其他三种变体符合你的预期(我没有测试(,你可以尝试它们,但结果也可能是Joda Time变体都不匹配。如果是这样的话,那么你对Joda Time完全没有运气了,可能需要使用另一个库。
既然你已经用"android jodatime"标记了你的问题,我假设并推测你需要在android上支持umalqura日历。如果是这样的话,那么你可能会考虑像msarhan或Time4A(我的库(这样的第三方库。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
-类,它也支持umalkura-calendar,但我认为这个API级别仍然排除了太多的Android用户。三个后台端口(例如Jake Whartons ThreeenABP库(不支持umalkura日历。