如何展示伊斯兰(hijri)原生日历?

时间:2018-03-20 09:10:37

标签: android datepicker calendar hijri

我想在Android上显示日期选择器Dialog。现在我只能选择普通日期。我如何将其转换为hijri(伊斯兰)日历?这是我用来显示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) {
    }
}

获取当前日期

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());
}

2 个答案:

答案 0 :(得分:3)

As you don't want a library and need only native code,您可以查看此实施的源代码:https://github.com/ThreeTen/threetenbp/tree/master/src/main/java/org/threeten/bp/chrono

查看HijrahChronologyHijrahDateHijrahEra课程,也许您可​​以获得一些想法,并了解如何在此日历和ISO8601日历之间进行所有数学转换。

但老实说,IMO日历的实施过于复杂,在大多数情况下,自己动手并不值得。这是添加库完全值得的情况之一。

使用ThreeTen-Backport lib - 和configuring it to use with Android - 将为您提供一种简单的方式来转换日期并格式化它们:

// 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

您也可以致电HijrahDate.now()直接获取当前日期。

您可以使用hijrahDateLocalDate.from(hijrahDate)转换回“正常”日期。

您还可以使用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);

答案 1 :(得分:0)

考虑到您在一条评论中提供的声明您只需要原生解决方案并拒绝任何额外的库,我建议您使用ICU4J-class IslamicCalendar

当然,你必须接受两个主要的缺点:

  • API级别24(在手机上不是那么普遍)
  • 老式API风格(例如不可变)

另一个缺点(仅在您对时钟时间感兴趣时才有意义)是ICU4J不支持前一天晚上的伊斯兰日开始。此功能仅在我的lib Time4J中支持,而不是其他任何地方。但您可能不需要在日期选择器对话框中使用此功能。

优点:

  • API风格类似于&#34;传统&#34;在java.util包中,所以我认为你已经习惯了它(但是很多/大多数人都认为风格是负面的,你必须做出自己的决定)
  • 至少umalqura-variant - 提供沙特阿拉伯的变体(注意:其他的文章如Threeten-BP或Joda-Time-Android不提供该变体)
  • 可接受甚至更好的国际化程度(也比ThreetenBP或Joda-Time-Android更好)

为了完整起见,如果您愿意将Android应用限制在26级或更高级别,那么您也可以使用java.time.chrono.HijrahChronology。但我认为这在2018年还为时尚早,因为26级手机的支持实际上非常小。虽然它确实提供了Umalqura变种(沙特阿拉伯),但它没有提供任何其他变体。

否则,没有可用的原生解决方案。并且仅使用原生解决方案也是一种限制,恕我直言。