4

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

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

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

4

1 回答 1

0

很抱歉回答迟了,尽管该解决方案自 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)不是任何月份的一部分。

于 2017-09-08T05:20:08.940 回答