androiddatepickercalendarhijri

How to show native Islamic(hijri) Calendar?


I want to show the date picker Dialog on Android. Now I can choose only Normal Date. How I can convert it to hijri(islamic) Calendar? Here is the code I am using to show the Dialog,

Code to Show Date-picker Dialog

private void showDOBPickerDialog(Context context, String DateString) {
    try {
        String defaltDate = getCurrentDate_MMDDYYYY();
        if (DateString == null || DateString.isEmpty() || DateString.length() < 10)
            DateString = defaltDate;

        int monthOfYear, dayOfMonth, year;
        monthOfYear = Integer.parseInt(DateString.substring(0, DateString.indexOf("/"))) - 1;
        dayOfMonth = Integer.parseInt(DateString.substring(DateString.indexOf("/") + 1, DateString.lastIndexOf("/")));
        year = Integer.parseInt(DateString.substring(DateString.lastIndexOf("/") + 1));

        DatePickerDialog datePickerDialog = new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                monthOfYear = monthOfYear + 1;
                String Month = String.valueOf(monthOfYear), Day = String.valueOf(dayOfMonth);
                if (monthOfYear < 10)
                    Month = "0" + monthOfYear;

                if (dayOfMonth < 10)
                    Day = "0" + dayOfMonth;
                String selectedDate = Month + "/" + Day + "/" + year;
                edtTxtDateOfId.setText(selectedDate);
            }
        }, year, monthOfYear, dayOfMonth);
        datePickerDialog.setTitle("Select Date");
        datePickerDialog.show();
    } catch (Exception e) {
    }
}

To get the Current Date,

public static String getCurrentDate_MMDDYYYY() {
    String DATE_FORMAT_NOW = "MM/dd/yyyy";
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    Calendar cal = GregorianCalendar.getInstance(Locale.FRANCE);
    cal.setTime(new Date());
    return sdf.format(cal.getTime());
}

Solution

  • As you don't want a library and need only native code, you can take a look at the source code of this implementation: https://github.com/ThreeTen/threetenbp/tree/master/src/main/java/org/threeten/bp/chrono

    Take a look at the HijrahChronology, HijrahDate and HijrahEra classes, perhaps you can get some ideas and see how all the math is done to convert between this calendar and ISO8601 calendar.

    But honestly, IMO calendars implementations are too complex and in most cases are not worth the trouble to do it by yourself. That's one of the cases where adding a library is totally worth it.

    Using the ThreeTen-Backport lib - and configuring it to use with Android - will give you an easy way to convert the dates and also to format them:

    // get ISO8601 date (the "normal" date)
    int dayOfMonth = 20;
    int monthOfYear = 3;
    int year = 2018;
    // March 20th 2018
    LocalDate dt = LocalDate.of(year, monthOfYear, dayOfMonth);
    
    // convert to hijrah
    HijrahDate hijrahDate = HijrahDate.from(dt);
    
    // format to MM/DD/YYYY
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
    String formatted = formatter.format(hijrahDate); // 07/03/1439
    

    You can also call HijrahDate.now() to directly get the current date.

    And you can convert the hijrahDate back to a "normal" date with LocalDate.from(hijrahDate).


    You can also use time4j:

    // get ISO8601 date (the "normal" date)
    int dayOfMonth = 20;
    int monthOfYear = 3;
    int year = 2018;
    PlainDate dt = PlainDate.of(year, monthOfYear, dayOfMonth);
    
    // convert to Hijri, using different variants
    HijriCalendar hijriDateUmalqura = dt.transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA);
    HijriCalendar hijriDateWest = dt.transform(HijriCalendar.class, HijriAlgorithm.WEST_ISLAMIC_CIVIL);
    
    // format to MM/DD/YYYY
    ChronoFormatter<HijriCalendar> fmt = ChronoFormatter.ofPattern("MM/dd/yyyy", PatternType.CLDR, Locale.ENGLISH, HijriCalendar.family());
    String formatted = fmt.format(hijriDateUmalqura); // 07/03/1439
    
    // get current date
    HijriCalendar now = HijriCalendar.nowInSystemTime(HijriCalendar.VARIANT_UMALQURA, StartOfDay.MIDNIGHT);
    
    // convert back to "normal" date
    PlainDate date = hijriDateUmalqura.transform(PlainDate.class);