calendar.getActualMaximum(Calendar.WEEK_OF_YEAR)在第1-11个月返回52,在第12个月返回53

时间:2016-04-06 12:03:59

标签: java date calendar

我使用calendar.getActualMaximum(Calendar.WEEK_OF_YEAR)来获取给定年份的总周数。这是我正在使用的功能:

public static void main(String[] args) {

    for(int i=2012; i<=2016; i++) {
        System.out.println("Year : " + i + ", Total Weeks : " + getNumWeeksForYear(i));
    }

}
public static int getNumWeeksForYear(int year) {  
    Calendar c = Calendar.getInstance();           
    c.set(year, 12, 31); //issue
    c.setFirstDayOfWeek(Calendar.MONDAY );
    return c.getActualMaximum(Calendar.WEEK_OF_YEAR);   
}
Output with c.set(year, 12, 31): 
Year : 2012, Total Weeks : 52
Year : 2013, Total Weeks : 52
Year : 2014, Total Weeks : 52
Year : 2015, Total Weeks : 52
Year : 2016, Total Weeks : 53
Output with c.set(year, 1, 31): 
Year : 2012, Total Weeks : 53
Year : 2013, Total Weeks : 52
Year : 2014, Total Weeks : 52
Year : 2015, Total Weeks : 52
Year : 2016, Total Weeks : 52

我无法弄清楚为什么当日历月设置为12月时,一年中的总周数会有所不同。我尝试使用1到12个月,对于1-11,周数相同但是更改为从实验中我可以预测它只发生在闰年。

我提到了以下链接:Calendar.getActualMaximum(Calendar.WEEK_OF_YEAR) weirdness

但这不能回答我的问题。

2 个答案:

答案 0 :(得分:2)

第一个月是

private static final int JANUARY = 0;

,上个月是

private static final int DECEMBER = 11;

这意味着月12是第二年的第一个月。

答案 1 :(得分:1)

这里几个月的索引从0开始形成。

JANUARY=0, FEBRUARY=1,.., DECEMBER=11

所以直到11它才会返回正确的值

示例代码:

public static int getNumWeeksForYear(int year) {  
        Calendar c = Calendar.getInstance();           
        c.set(year, 11,31); //issue
        c.setFirstDayOfWeek(Calendar.MONDAY );
        return c.getActualMaximum(Calendar.WEEK_OF_YEAR);   
    }

输出:

Year : 2012, Total Weeks : 53
Year : 2013, Total Weeks : 52
Year : 2014, Total Weeks : 52
Year : 2015, Total Weeks : 52
Year : 2016, Total Weeks : 52

如果你给的比11更重要

c.set(year, 14,31);

输出:

Year : 2012, Total Weeks : 52
Year : 2013, Total Weeks : 52
Year : 2014, Total Weeks : 52
Year : 2015, Total Weeks : 52
Year : 2016, Total Weeks : 53

计算一年中准确的周数see this example