我使用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);
}
c.set的输出(年份,12,31):年份:2012,总周数:52年份:2013,总周数:52年份:2014,总周数:52年份:2015,总周数:52年份:2016,总周数:53
c.set的输出(年份,1,31):年份:2012,总周数:53年份:2013,总周数:52年份:2014,总周数:52年份:2015,总周数:52年份:2016,总周数:52
我不明白为什么当日历月设置为12月时,一年中的总周数会有所不同。我试过使用1-12个月,1-11个月的周数相同,但12个月有所变化。根据实验,我可以预测只有闰年才会发生这种情况。
我引用了以下链接:Calendar.getActualMaximum(Calendar.WEEK_OF_YEAR)怪异
但这并不能回答我的疑问。
第一个月是
private static final int JANUARY = 0;
最后一个月是
private static final int DECEMBER = 11;
这意味着月份12
是下一年的第一个月。
这里的月份索引从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
要计算一年中准确的周数,请参阅以下示例