Получить неделю в месяце в календаре хиджры в 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) не являются частью какого-либо месяца.

Другие вопросы по тегам