0

我想在 Android 上显示日期选择器对话框。现在我只能选择正常日期。如何将其转换为回历(伊斯兰)日历?这是我用来显示对话框的代码,

显示日期选择器对话框的代码

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

2 回答 2

3

由于您不需要库并且只需要本机代码,您可以查看此实现的源代码:https ://github.com/ThreeTen/threetenbp/tree/master/src/main/java/org /threeten/bp/chrono

看看HijrahChronology,HijrahDateHijrahEra类,也许你能得到一些想法,看看所有的数学是如何在这个日历和 ISO8601 日历之间转换的。

但老实说,IMO 日历的实现过于复杂,在大多数情况下不值得自己费心去做。这是添加库完全值得的情况之一。

使用ThreeTen-Backport 库- 并将其配置为与 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()直接获取当前日期。

您可以使用 . 将hijrahDate背面转换为“正常”日期LocalDate.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);
于 2018-03-20T13:05:54.900 回答
0

考虑到您在一条评论中给出的声明,即您只想要一个本机解决方案并拒绝任何额外的 library,我建议使用 ICU4J-class IslamCalendar

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

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

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

好处:

  • API 风格类似于 package 中的“传统” java.util,所以我假设你已经习惯了它(但很多/大多数人认为这种风格相当消极,你必须自己做出决定)
  • 至少提供了沙特阿拉伯的umalqura-variant -variant(注意:其他库,如 Threeten-BP 或 Joda-Time-Android 不提供该变体)
  • 可接受甚至良好的国际化程度(也优于 ThreetenBP 或 Joda-Time-Android)

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

否则,没有可用的本地解决方案。恕我直言,仅使用本机解决方案也是一种限制。

于 2018-03-20T16:09:29.330 回答