我只是尝试使用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天月份的索引是真的,而对于没有的则是假的。
答案 0 :(得分:2)
我相信日历会记住你一年中有多少天。在2012年你是在31 + 29 = 2月29日。2011年是3月1日。然后你问了那个月的实际最大值,(3月份)是31。
Calendar API非常糟糕。
您应该在询问用例中的实际最大值之前直接设置年份和月份。
答案 1 :(得分:0)
这是因为2012年2月29日前一年是2011年3月1日。
答案 2 :(得分:0)
2011年2月没有第29天s,classe会自动调整第一个有效日期。它相信你会在2月28日(即3月1日)之后的第一天跳华尔兹。