在 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)不属于任何月份。