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 使用的变体。该库仅支持四种算法变体,请参阅 API 中 IslamicChronology.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 日历。
我使用 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 使用的变体。该库仅支持四种算法变体,请参阅 API 中 IslamicChronology.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 日历。