为什么java.util.Calendar返回最小的WEEK_OF_MONTH值为零?

时间:2018-10-12 13:32:34

标签: java calendar week-number

我正在尝试如下设置WEEK_OF_MONTH字段的最小值:

calendar.set(WEEK_OF_MONTH, calendar.getActualMinimum(WEEK_OF_MONTH));

致电

calendar.getActualMinimum(WEEK_OF_MONTH)

返回0

但是在进行get *操作时,该字段变为5。 而且,如果没有宽大处理模式,我会得到

java.lang.IllegalArgumentException: WEEK_OF_MONTH: 0 -> 5 // or MONTH: 9 -> 8
    at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2829)
    at java.util.Calendar.updateTime(Calendar.java:3393)
    at java.util.Calendar.complete(Calendar.java:2265)
    at java.util.Calendar.get(Calendar.java:1826)
    at Main.main(Main.java:19)

如果我将WEEK_OF_MONTH设置为1,那么我正确地将其设置为1。

签出example

任何人都可以澄清这种行为吗?预先感谢。

1 个答案:

答案 0 :(得分:1)

java.time

    Locale russia = Locale.forLanguageTag("ru-RU");
    WeekFields wf = WeekFields.of(russia);

    LocalDate date = LocalDate.now(ZoneId.of("Europe/Moscow"));
    int minimumWeekOfMonth = date.with(TemporalAdjusters.firstDayOfMonth()).get(wf.weekOfMonth());
    System.out.println("Minimum week of month: " + minimumWeekOfMonth);
    LocalDate dateInFirstWeekOfMonth = date.with(wf.weekOfMonth(), minimumWeekOfMonth);
    System.out.println("Date in first week of month: " + dateInFirstWeekOfMonth);

刚才运行此代码段时,我得到以下输出:

Minimum week of month: 1
Date in first week of month: 2018-10-05

我假设您在俄罗斯语言环境中。俄罗斯使用国际周编号,其中星期一是一周中的第一天,一年或一个月中的一个星期是包含一年或一个月中至少四天的第一周。因此,2018年10月的第1周是从10月1日星期一到10月7日星期日。这又意味着该月的最小星期是1。从今天(星期五)开始,将月份的星期几设置为1,就可以得到星期几。 1,即10月5日,星期五。

如果我从9月12日星期三开始,我会得到:

Minimum week of month: 0
Date in first week of month: 2018-08-29

9月的第1周是从9月3日星期一到9月9日。这意味着9月1日和2是在第0周,因此0是9月的最小月份。从星期三开始,当我将星期数设置为0时,我得到了该周的星期三,恰好在8月29日。8月29日。如果我们要求该日期的月份中的星期几,是否会得到0? >

    System.out.println("Week of month: " + dateInFirstWeekOfMonth.get(wf.weekOfMonth()));

输出:

Week of month: 5

由于日期为8月,所以我们现在可以看到日期为8月的哪一周,恰好是第5周。

您的代码中发生了什么?

在我看来GregorianCalendar.getActualMinimum(Calendar.WEEK_OF_MONTH)总是返回0。我无法理解这种观察。由于俄罗斯使用公历,因此GregorianCalendar的实例就是您从Calendar.getInstance真正得到的。

我不想打扰。正如我在评论中已经说过的那样,Calendar类早已过时,并且存在一系列设计问题,因此,建议您不要使用它。当然,我随时都希望使用java.time(现代的Java日期和时间API)。

链接

Oracle tutorial: Date Time解释了如何使用java.time