Ошибка при преобразовании даты по григорианскому календарю в дату по хиджре (Android Studio)

Я разрабатываю приложение, которому нужна дата хиджры, я использовал то, что было опубликовано здесь преобразование григорианского языка в дату хиджры< /а> .

Это работает для меня, но дает неправильную дату, например, когда по григорианскому календарю 20/9/2016, оно стало 17/12/1437 по хиджре, и это неправильно, должно быть 19/12/1437.

В чем проблема ?


person Fatimah Mohmmed    schedule 21.09.2016    source источник


Ответы (1)


Что касается вашего примера преобразования, мне кажется, что вы ищете вариант Умалькуры календаря Хиджры, который является официальным календарем Саудовской Аравии.

Опубликованная вами SO-ссылка относится к Джода-Время. Эта библиотека поддерживает не умалкуру, а четыре алгоритмических варианта календаря хиджры (пригодны только в качестве приближения). Я протестировал все четыре поддерживаемых варианта. Никто не для вас.

Chronology iso = ISOChronology.getInstanceUTC();
Chronology hijri =
    IslamicChronology.getInstance(DateTimeZone.UTC, IslamicChronology.LEAP_YEAR_INDIAN);
LocalDate todayIso = new LocalDate(2016, 9, 20, iso);
LocalDate todayHijri = new LocalDate(todayIso.toDateTimeAtStartOfDay(), hijri);
System.out.println("joda=" + todayHijri);
// LEAP_YEAR_15_BASED => 1437-12-16
// LEAP_YEAR_16_BASED => 1437-12-16
// LEAP_YEAR_HABASH_AL_HASIB => 1437-12-17
// LEAP_YEAR_INDIAN => 1437-12-17

Если вы работаете на платформе Java-8, вы можете использовать следующее решение. Однако, если вы работаете на Android и пытаетесь использовать бэкпорт ThreetenABP, это не удастся, потому что его реализация отличается от Java-8:

HijrahDate hd = HijrahDate.from(LocalDate.of(2016, 9, 20));
System.out.println("java.time=" + hd); // Hijrah-umalqura AH 1437-12-19

Если вам нужны дополнительные функции календаря, такие как другие варианты или переменное начало дня (исламские дни начинаются на закате!), или если вы работаете на Android, вы можете использовать мою библиотеку Time4J/A. HijriCalendar Time4J (или Time4A на Android) дает то, что вы хотите:

System.out.println(
  PlainDate.of(2016, 9, 20)
    .transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA)); 
// AH-1437-12-19[islamic-umalqura]

Обратите внимание, что последний пример — это преобразование, действительное в полдень. При использовании вечера в качестве начала дня обратитесь к javadoc, как это сделать.

Обновление от 07 сентября 2016 г.:

Другие возможные решения umalqura с очень разными API на Android включают

person Meno Hochschild    schedule 21.09.2016
comment
Спасибо, это было очень полезно для меня. - person Fatimah Mohmmed; 22.09.2016
comment
Кроме того, я нашел отличную библиотеку для календаря Umalqura здесь [ссылка] (github.com/msarhan/ummalqura-calendar ) - person Fatimah Mohmmed; 23.09.2016