【问题标题】:Get week in month in hijri calendar in time4j在 time4j 中获取回历中每月的一周
【发布时间】:2017-05-23 15:24:52
【问题描述】:

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

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

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

【问题讨论】:

  • 我在 Time4J 的问题跟踪器上打开了一个新的issue。与此同时,对于这个缺失的新功能,唯一的解决方法是:遍历给定月份的所有日子,并计算搜索到的工作日发生的频率。
  • 我现在已经实现了 v3.33 版本的新功能(但还没有发布)。
  • 我的朋友用这个 lib 做得很好。我期待看到新版本。

标签: java android date calendar time4j


【解决方案1】:

抱歉,虽然该解决方案自 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)不属于任何一个月。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    相关资源
    最近更新 更多