2

我只是在尝试 java.util.Calendar 方法getActualMaximum(),看看我是否可以获得一年中一个月的最大天数。这是我的代码:

public static void main(String[] args) {
    Calendar c = Calendar.getInstance(); // today is July 29, 2012
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR));
    c.set(Calendar.MONTH, Calendar.FEBRUARY); // set to February 2012
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR));
    c.set(Calendar.YEAR, 2011); // set year to 2011, now February 2011
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR));
}

我期待的输出是:

6 31 2012 // last day of July 2012 is 31
1 29 2012 // last day of Feb 2012 is 29
1 28 2011 // last day of Feb 2011 is 28

但是,这就是我得到的:

6 31 2012
1 29 2012
2 31 2011 // HUH?

(在 java.util.Calendar 中,1 月到 12 月的月份值从 0 到 11 开始,而月份本身的天数从 1 开始。)

为什么月份突然设置为 Calendar.MARCH?这里发生了什么,我该怎么做才能正确获取给定月份和年份的最后几天?我正在探索该方法,因为我不想设置我自己的布尔数组,其中对于代表 31 天月份的索引为 true,而对于不为 false。

4

3 回答 3

2

我相信日历会记住你一年中有多少天。在 2012 年,您在第 31 天 + 29 = 2 月 29 日。在 2011 年,那是 3 月 1 日。然后您要求该月的实际最大值,即(3 月)为 31。

日历 API 很糟糕。

在询问用例中的实际最大值之前,您应该直接设置年份和月份。

于 2012-07-29T03:28:34.807 回答
0

这是因为 2012 年 2 月 29 日之前的一年是 2011 年 3 月 1 日。

于 2012-07-29T03:28:22.997 回答
0

2011 年 2 月没有第 29 天,因此课程会自动调整为第一个有效日期。它认为你在 2 月 28 日之后的第一天,也就是 3 月 1 日之后,会走路。

于 2012-07-29T03:31:31.410 回答