Java关于跨年周数计算的问题解释,以及解决办法(附代码+图)

小编最近的大数据采集项目,有一个按周统计的功能,业务讨论中就遇到了这样一个问题:每年的第一周怎么计算?

可能这么说有点懵,我们用实例来说明,如下:

实例:

以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年的第一周。

总结:

  1. Calendar工具类中,每一周的第一天是周日,最后一天是周六;
  2. Calendar工具类默认1月1日所在的周即为当年的第一周;
  3. 如果业务有需求,可以有选择的进行天数处理,使用calendar.setMinimalDaysInFirstWeek(int num)方法;
  4. 如果未定义calendar.setMinimalDaysInFirstWeek(int num)中的num值,Calendar将默认为1。

更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务

发布了147 篇原创文章 · 获赞 169 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44259720/article/details/103890989