我想在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());
}
答案 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
查看HijrahChronology
,HijrahDate
和HijrahEra
课程,也许您可以获得一些想法,并了解如何在此日历和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()
直接获取当前日期。
您可以使用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);
答案 1 :(得分:0)
考虑到您在一条评论中提供的声明您只需要原生解决方案并拒绝任何额外的库,我建议您使用ICU4J-class IslamicCalendar。
当然,你必须接受两个主要的缺点:
另一个缺点(仅在您对时钟时间感兴趣时才有意义)是ICU4J不支持前一天晚上的伊斯兰日开始。此功能仅在我的lib Time4J中支持,而不是其他任何地方。但您可能不需要在日期选择器对话框中使用此功能。
优点:
java.util
包中,所以我认为你已经习惯了它(但是很多/大多数人都认为风格是负面的,你必须做出自己的决定)为了完整起见,如果您愿意将Android应用限制在26级或更高级别,那么您也可以使用java.time.chrono.HijrahChronology。但我认为这在2018年还为时尚早,因为26级手机的支持实际上非常小。虽然它确实提供了Umalqura变种(沙特阿拉伯),但它没有提供任何其他变体。
否则,没有可用的原生解决方案。并且仅使用原生解决方案也是一种限制,恕我直言。