I'm sorry you felt bad. Many people blindly recommend such well-known libraries as Joda-Time, without even checking if this can solve your problem and meet your requirements .
What is the requirement? You stated:
value tuple (1436, "SHawwal", 18) => gregorian date as String ("3rd August 2015")
, Joda-Time . ( "شوال" ) - . Joda-Time:
Chronology hijri =
IslamicChronology.getInstance(DateTimeZone.UTC, IslamicChronology.LEAP_YEAR_INDIAN);
LocalDate dtHijri = new LocalDate(1436, 10, 18, hijri);
Chronology iso = ISOChronology.getInstanceUTC();
LocalDate dtIso =
dtHijri.toDateTimeAtStartOfDay(DateTimeZone.UTC)
.withChronology(iso).toLocalDate();
System.out.println("hijri-to-gregorian: " + dtHijri + "=>" + dtIso);
, Joda-Time (LEAP_YEAR_15_BASED, LEAP_YEAR_16_BASED, LEAP_YEAR_HABASH_AL_HASIB LEAP_YEAR_INDIAN), "2015-08-04", . .
Java-8 ?
HijrahDate hd = HijrahChronology.INSTANCE.date(HijrahEra.AH, 1436, 10, 18);
LocalDate ld = LocalDate.from(hd);
System.out.println("java-8: " + ld);
, , Android. , Java-8 .
: Java-8 ? Umalqura-calendar , Joda-Time . , ( , , ).
, ThreetenABP, backport java.time (JSR-310) Android?
HijrahDate hd = HijrahChronology.INSTANCE.date(HijrahEra.AH, 1436, 10, 18);
org.threeten.bp.LocalDate ld = org.threeten.bp.LocalDate.from(hd);
System.out.println("threeten-bp: " + ld);
, . ThreetenBP Java-8 , . ThreetenBP Umalqura! LEAP_YEAR_16_BASED Joda-Time. , () ThreetenBP , , , . , Java-, ThreetenABP ( Android ThreetenBP) Android.
ICU4J?
ICU4J ( Unicode), , , , : ISLAMIC, ISLAMIC_TBLA ISLAMIC_UMALQURA. 3 "2015-08-03" . , , ! TBLA-, , LEAP_YEAR_16_BASED Joda-Time ( - ). ISLAMIC - . , - , ???
, ICU4J . Android (10,7 ). , , Android.
: Time4A
Hijri Android Time4A, Hijri . ( v3.6-2015f) 8 , tbla- (HijriAlgorithm.WEST_ISLAMIC_ASTRO), Umalqura ICU4J. : Time4A ( new Locale("ar")). :
HijriCalendar hijri =
HijriCalendar.of(HijriCalendar.VARIANT_UMALQURA, 1436, HijriMonth.SHAWWAL, 18);
PlainDate iso = hijri.transform(PlainDate.class);
System.out.println("Time4A: " + iso);
:
int hijriYear = 1436;
String hijriMonth = "SHawwal";
int hijriDayOfMonth = 18;
ChronoFormatter<HijriCalendar> inputFormat =
ChronoFormatter.setUp(HijriCalendar.class, Locale.ENGLISH)
.addPattern("yyyyMMMMd", PatternType.NON_ISO_DATE).build();
HijriCalendar hijriDate =
inputFormat
.with(Attributes.PARSE_CASE_INSENSITIVE, true)
.withCalendarVariant(HijriCalendar.VARIANT_UMALQURA)
.parse(hijriYear + hijriMonth + hijriDayOfMonth);
PlainDate iso = hijriDate.transform(PlainDate.class);
ChronoFormatter<PlainDate> outputFormat =
ChronoFormatter.setUp(PlainDate.class, Locale.ENGLISH)
.addEnglishOrdinal(PlainDate.DAY_OF_MONTH)
.addPattern(" MMMM uuuu", PatternType.CLDR).build();
String s = outputFormat.format(iso);
System.out.println(s);
, Hijri . .