在 StackOverflow 上,我找到了这个问题和相关答案,希望对您有所帮助。不幸的是,Joda-Time 在回历月份名称方面显然被打破了。
2015-09-15 更新:
一年多过去了,Joda-Time 仍然没有真正的解决方案。我开发自己的日期时间库Time4A(Android 上的 v3.8-2015f)的另一个原因。我现在自己用这种方式解决了。OP 在 SO 上可能不再处于活动状态,但我希望它对所有有类似问题的人有用:
// determine current date (local timezone and start-of-day = 18:00 on previous day)
HijriCalendar todayHijri =
SystemClock.inLocalView().now(
HijriCalendar.family(),
HijriCalendar.VARIANT_UMALQURA,
StartOfDay.EVENING
).toDate();
// standard localizable format (support for 46 languages)
ChronoFormatter<HijriCalendar> hijriFormat =
ChronoFormatter.setUp(HijriCalendar.class, new Locale("ar"))
.addPattern("d-MMMM-yyyy", PatternType.CLDR).build();
String hijriView = hijriFormat.format(todayHijri);
System.out.println("Hijri: " + hijriView); // Hijri: ٢-ذو الحجة-١٤٣٦
System.out.println("ISO: " + todayHijri.transform(PlainDate.class)); // ISO: 2015-09-15
// custom format with following month names:
Map<HijriMonth, String> monthNames = new HashMap<>();
monthNames.put(HijriMonth.MUHARRAM, "Muharram");
monthNames.put(HijriMonth.SAFAR, "Safar");
monthNames.put(HijriMonth.RABI_I, "Rabi al-Awwal");
monthNames.put(HijriMonth.RABI_II, "Rabi al-Akhir");
monthNames.put(HijriMonth.JUMADA_I, "Jamadi al-Awwal");
monthNames.put(HijriMonth.JUMADA_II, "Jamadi al-Akhir");
monthNames.put(HijriMonth.RAJAB, "Rajab");
monthNames.put(HijriMonth.SHABAN, "Shabaan");
monthNames.put(HijriMonth.RAMADAN, "Ramadhan");
monthNames.put(HijriMonth.SHAWWAL, "Shawwal");
monthNames.put(HijriMonth.DHU_AL_QIDAH, "Zilqad");
monthNames.put(HijriMonth.DHU_AL_HIJJAH, "Zilhajj");
ChronoFormatter<HijriCalendar> hijriFormat2 =
ChronoFormatter.setUp(HijriCalendar.class, Locale.ROOT)
.addInteger(HijriCalendar.DAY_OF_MONTH, 1, 2).addLiteral('-')
.addText(HijriCalendar.MONTH_OF_YEAR, monthNames)
.addPattern("-yyyy", PatternType.CLDR).build();
System.out.println(hijriFormat2.format(todayHijri)); // 2-Zilhajj-1436
重要提示: Hijri 日历知道不同的变体,这些变体导致公历中的不同日子 - 给定一个 Hijri 日期。Time4A 实际上提供了 10 种变体。该代码示例使用沙特阿拉伯的 Umalqura 变体。