我用乔达写:
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]
答案 0 :(得分:1)
您真正的问题是没有考虑您需要哪种伊斯兰日历。
Hijri 1440年第二个月有30天的期望仅适用于例如沙特阿拉伯的Umalqura日历,但不适用于Joda-Time使用的变体。该库仅支持四种算法变体,请参见API中IslamicChronology.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日历。