问题描述
对Calendar的这个WEEK_OF_YEAR的历法做个总结。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cl = Calendar.getInstance();
cl.setTime(sdf.parse("2012-12-31"));
int week = cl.get(Calendar.WEEK_OF_YEAR);
System.out.println(week);
结果是1.而我们期望的可能是53周
问题分析
这个week_of_year和两个值有关。
- firstDayOfWeek: 用周几作为一周的第一天,我们默认的是SUNDAY,德国的是周三(这个和本地化有关)
- minimalDaysInFirstWeek: 一年的第一周用几号开始算。
- System.out.println(cl.getFirstDayOfWeek()); //SUNDAY
- System.out.println(cl.getMinimalDaysInFirstWeek());//1
打印出来的结果是从周日开始做为1周的开始,新年的第一天从1号开始。
2012年最后几天的日历如下:
周日 1 2 3 4 5 6
30号 31 1 2 3 4 5
新年的第一天是1号(minimalDaysInFirstWeek)在周二,一周必须由7天组成,又是从周日(firstDayOfWeek)开始算起,所以30,31都属于第1周就等到了上面的结果。
要跟这个原理可以分别修改这两个属性可以提到不同的结果。
方法1:
- cl.setFirstDayOfWeek(Calendar.TUESDAY);
修改每周从周二开始,而周2正好是1号,所以12-31的week值为53
方法2:
- cl.setMinimalDaysInFirstWeek(6);
修改新年从6号开始算起,6号正好是周日,一周的开始,所以6号前的7天的week值都是53.