Получить неделю в месяце в календаре хиджры в time4j
Я пытаюсь установить календарь хиджры, например, на 3-ю среду месяца хиджры.
После некоторого поиска я дохожу до этого кода:
PlainDate date = PlainDate.of(2017, 3, 1); // first of march 2017
System.out.println(date.with(WEEKDAY_IN_MONTH.setToThird(WEDNESDAY)));
Но, как вы можете видеть, это устанавливает календарь на 3-ю среду григорианского календаря.
Есть ли способ установить третью среду месяца для других календарей в time4j lib?
1 ответ
Извините за поздний ответ, хотя решение уже доступно с конца июля 2017 года в выпуске v4.28 / 3.33. (Сейчас я занят открытым текстом v4.29/3.34 (рассвет / закат-расчеты)).
Календарь на каждый месяц (включая HijriCalendar
) поддерживает WEEKDAY_IN_MONTH-элемент начиная с Time4A-версии v3.33-2017b. Это зависит от хронологии, потому что определение месяца отличается для каждого календаря. Пример:
HijriCalendar hijri =
HijriCalendar.of(
HijriCalendar.VARIANT_UMALQURA, 1395, HijriMonth.RAMADAN, 1); // Sunday, 1975-09-07
assertThat(
hijri.with(HijriCalendar.WEEKDAY_IN_MONTH.setTo(3, Weekday.WEDNESDAY)),
is(hijri.plus(17, HijriCalendar.Unit.DAYS))); // AH-1395-09-18
Дополнительные примеры использования нового элемента можно найти в JUnit-тесте. Новый элемент также может использоваться в шаблонах форматирования с символом CLDR-pattern "F". Я показываю как построитель, так и основанный на шаблонах подход:
ChronoFormatter<HijriCalendar> f1 =
ChronoFormatter.setUp(HijriCalendar.family(), Locale.ENGLISH)
.addEnglishOrdinal(HijriCalendar.WEEKDAY_IN_MONTH)
.addPattern(" EEEE 'in' MMMM", PatternType.CLDR)
.build();
assertThat(f1.format(hijri), is("1st Sunday in Ramadan"));
ChronoFormatter<HijriCalendar> f2 =
ChronoFormatter.ofPattern(
"F. EEEE 'im' MMMM",
PatternType.CLDR,
Locale.GERMAN,
HijriCalendar.family());
assertThat(f2.format(hijri), is("1. Sonntag im Ramadan"));
Примечание: новый FrenchRepublicanCalendar
(также введенный в v4.28/3.33) не поддерживает WEEKDAY_IN_MONTH, потому что a) он использует 10-дневную неделю и b) некоторые дни (sansculottides) не являются частью какого-либо месяца.