Get gregorian date from hijri date string

I would like to get a gregorian date from hijri date indices.

eg

getDate(1436, "SHawwal", 18)

This should return

3rd August 2015

How can I do the conversion?

+3
source share
1 answer

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 = // Joda does not offer a direct conversion, sorry
  dtHijri.toDateTimeAtStartOfDay(DateTimeZone.UTC)
  .withChronology(iso).toLocalDate(); 
System.out.println("hijri-to-gregorian: " + dtHijri + "=>" + dtIso); 
// hijri-to-gregorian: 1436-10-18=>2015-08-04

, 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); // java-8: 2015-08-03

, , 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); // threeten-bp: 2015-08-04

, . 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); // Time4A: 2015-08-03

:

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); // 3rd August 2015

, Hijri . .

+4

All Articles