在 time4j 的回历中获取一个月中的一周

Get week in month in hijri calendar in time4j

我正在尝试将回历设置为例如回历月份的第三个星期三。
经过一番搜索,我找到了这段代码:

 PlainDate date = PlainDate.of(2017, 3, 1); // first of march 2017
 System.out.println(date.with(WEEKDAY_IN_MONTH.setToThird(WEDNESDAY)));    

但是如您所见,这会将日历设置为公历的第 3 个星期三。
有没有办法在 time4j lib 中为其他日历设置每月的第三个星期三?

虽然该解决方案自 2017 年 7 月底发布 v4.28/3.33 以来已经可用,但很抱歉回答晚了。 (我现在忙于overnext release v4.29/3.34 (sunrise/sunset-calculations)).

自 Time4A 版本 v3.33-2017b 以来,每个基于月的日历(包括 HijriCalendar)都支持 WEEKDAY_IN_MONTH-element。它是特定于年表的,因为每个日历的月份定义都不同。示例:

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-test 中找到有关如何使用新元素的更多示例。新元素也可以用于带有 CLDR-pattern-symbol "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)不属于任何月份。