Используя 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]
2
geek 8 Ноя 2018 в 09:58

1 ответ

Лучший ответ

Ваша настоящая проблема - не подумать, какой вариант исламского календаря вам нужен.

Предположение, что во втором месяце 1440 года по хиджре 30 дней, верно только, например, для календаря Умалкура в Саудовской Аравии, но не для варианта, используемого Joda-Time. Эта библиотека поддерживает только четыре алгоритмических варианта, см. Определение IslamicChronology.LeapYearPatternType - констант в API. В вашем коде неявно используется вариант LEAP_YEAR_16_BASED. Вы можете попробовать другие три варианта, если они соответствуют вашим ожиданиям (не проверены мной), но в результате также может быть то, что ни один из вариантов Joda-Time не будет соответствовать. Если это так, то вам совершенно не повезло с Joda-Time, и, вероятно, вам потребуется использовать другую библиотеку.

Поскольку вы пометили свой вопрос с помощью "android-jodatime", я предполагаю и предполагаю, что вам нужна поддержка календаря umalqura на Android. В таком случае вы можете рассмотреть сторонние библиотеки, такие как 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);
}

Если вы используете только уровень API Android 26 или выше, вы также можете попробовать новый класс java.time.chrono.HijrahDate, который также поддерживает umalqura-calendar, но я предполагаю, что этот уровень API по-прежнему исключает слишком много пользователей Android. И threeten-backport (например, Jake Whartons ThreetenABP-library), к сожалению, НЕ поддерживает календарь umalqura).

3
Meno Hochschild 9 Ноя 2018 в 04:56