很抱歉回答迟了,尽管该解决方案自 2017 年 7 月结束以来已在 v4.28/3.33 版本中可用。(我现在正忙于下一个版本 v4.29/3.34(日出/日落计算))。
自 Time4A 版本 v3.33-2017b 以来,每个基于月份的日历(包括HijriCalendar
)都支持 WEEKDAY_IN_MONTH 元素。它是特定于年表的,因为每个日历的月份定义都不同。例子:
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 模式符号“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)不是任何月份的一部分。