Как отобразить имя месяца хиджры в виде строки, используя Joda-Time?
Это мой код для отображения даты хиджры. Полученный формат для любого месяца хиджры указан в целых числах, но мне нужно, чтобы он был в строке, поэтому я добавил массив строк для названий месяцев хиджры.
Chronology iso = ISOChronology.getInstanceUTC();
Chronology hijri = IslamicChronology.getInstanceUTC();
String [] hmonths= {"Muharram", "Safar", "Rabi al-Awwal", "Rabi al-Akhir", "Jamadi al-Awwal", "Jamadi al-Akhir", "Rajab", "Shabaan", "Ramadhan", "Shawwal", "Zilqad", "Zilhajj"};
//month + 1 : because get month return month-1
LocalDate todayIso = new LocalDate(c.get(c.YEAR),c.get(c.MONTH)+1), c.get(c.DAY_OF_MONTH), iso);
LocalDate todayHijri = new LocalDate(todayIso.toDate(), hijri);
DateTimeFormatter fmt = DateTimeFormat.forPattern("d-MMMM-yyyy");
hijriView.setText(todayHijri.toString(fmt) );
1 ответ
На Stackru я нашел этот вопрос и связанные с ним ответы и надеюсь, что он вам поможет. К сожалению, Joda-Time явно нарушает названия месяцев хиджры.
Обновление 2015-09-15:
Спустя больше года у Joda-Time все еще нет реального решения. Еще одна причина, почему я разработал свою собственную библиотеку даты-времени Time4A (v3.8-2015f на Android). Теперь я сам решил это так. Возможно, OP здесь больше не активен, но я надеюсь, что он полезен для всех людей с похожей проблемой:
// 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
Важно: календарь хиджры знает разные варианты, которые приводят к разным дням в григорианском календаре - с учетом одной даты хиджры. Time4A предлагает 10 вариантов. Пример кода использует вариант Umalqura Саудовской Аравии.