Ява: Как добавить дни к дате хиджры? - PullRequest
0 голосов
/ 08 ноября 2018

Используя 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]

1 Ответ

0 голосов
/ 09 ноября 2018

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

Ожидание того, что во втором месяце хиджры 1440 года 30 дней, верно только для календаря Umalqura в Саудовской Аравии, но не для варианта, используемого 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 (например, библиотека ThreetenABP Джейка Уортона), к сожалению, НЕ поддерживает календарь umalqura).

...