小编最近的大数据采集项目,有一个按周统计的功能,业务讨论中就遇到了这样一个问题:每年的第一周怎么计算?
可能这么说有点懵,我们用实例来说明,如下:
实例:
以2020年的1月1日为例,当天是从周三开始的,这是跨年的一周。也就是说,元旦既是2019年的最后一周,也是2020年的第一周,那最终该如何归类?业务对数据展示的需求尤为严禁,如果不加考虑最后肯定会出问题,这就需要一个统一的标准。
注意:Calendar工具类中,每一周的第一天是周日,最后一天是周六!!
首先,对日期的处理,小编提倡必须必须使用Calendar工具类,先来看看它的默认处理:
public void testGetWeekNo() throws ParseException{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(dateFormat.parse("2020-1-1"));
int weekNo = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println("第" + weekNo + "周");
}
输出结果:第1周
意思就是说:Calendar工具类默认的第1周,就是元旦所在的那一周。
业务要求:
2020年时间占一周时间超过4天才算当年的第一周,否则算上一年的最后一周。
此时,我们就要用到Calendar工具类的 calendar.setMinimalDaysInFirstWeek(int num) 方法,处理如下:
public void testGetWeekNo() throws ParseException{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setMinimalDaysInFirstWeek(5);
calendar.setTime(dateFormat.parse("2020-1-1"));
int weekNo = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println("第" + weekNo + "周");
}
输出结果:第53周
意思就是说:2020-1-1元旦这一天,被算作了2019年的最后一周,即第53周。
我们再试试上面的代码,对2020-1-5(周日)如何定义:
public void testGetWeekNo() throws ParseException{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setMinimalDaysInFirstWeek(5);
calendar.setTime(dateFormat.parse("2020-1-5"));
int weekNo = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println("第" + weekNo + "周");
}
输出结果:第1周
意思就是说:再增加了 calendar.setMinimalDaysInFirstWeek(5) 处理以后,2020-1-5日开始的这一周被当做的2020年的第一周。
总结:
- Calendar工具类中,每一周的第一天是周日,最后一天是周六;
- Calendar工具类默认1月1日所在的周即为当年的第一周;
- 如果业务有需求,可以有选择的进行天数处理,使用calendar.setMinimalDaysInFirstWeek(int num)方法;
- 如果未定义calendar.setMinimalDaysInFirstWeek(int num)中的num值,Calendar将默认为1。
更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务