文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

hutool日期工具类相关:获取某月所有周、某周的起止时间或所有日期、计算连续天数

2023-09-02 07:01

关注

目录

最近做项目,碰到一个比较复杂的日期查询方式,在这里记录一下,方便以后忘了随时能查到。
像我们一般查询日期,页面上用的日期选择器,一般都是直接查某一天或者选择开始、结束时间,查一个范围。不过这次需要我们按某月的某周来查询,比如页面上直接显示这个月有几周,然后选第一周就直接传第一周给后端。(如下面这种方式)
在这里插入图片描述
因此,我们要先计算这个月有几周,然后计算每周的起止时间,放到一个map中,通过前端传过来的第几周直接去map中拿。

要计算起止时间,建议先引入hutool依赖,更方便。

<dependency>    <groupId>cn.hutoolgroupId>    <artifactId>hutool-allartifactId>    <version>5.8.11version>dependency>

1、获取当月的所有周

第一步,我们要先获得这个月的所有周。这个不是按照每周七天算的,比如2023.1月,它的第一周是1号,最后一周是30、31号。像这种情况它不一定每周都有七天,这一周只有一天、两天也是算一周的。而不是直接按照这个月有多少天直接除以7天这么算的。

在这里插入图片描述

public List<String> monthWeekNum(){    // DateUtil是hutool的类    DateTime end = DateUtil.endOfMonth(new Date()); // 获取本月最后一天    int weekNum = DateUtil.weekOfMonth(end); // 获取本月最后一天在第几周    List<String> list = new ArrayList<>();    for (int i = 1; i <= weekNum; i++) {        list.add("第"+i+"周");    }    return list;}

2、根据指定的第几周,获取这周的开始、结束时间

拿到了本月有几周,第二步就计算每周的开始、结束日期。

public static String[] getStartEndOfWeek(String week){    // 如果没有传week,则默认查询当前周的开始、结束时间    if (StrUtil.isEmpty(week)){        String[] result = new String[2];        Date date = new Date();        // 获取本周的开始时间和结束时间        result[0] = DateUtil.beginOfWeek(date).toString("yyyy-MM-dd");        result[1] = DateUtil.endOfWeek(date).toString("yyyy-MM-dd");        return result;    }    int weekNo = Integer.parseInt(week.replace("第", "").replace("周", ""));    String weekOfDate = getWeekOfDate(weekNo);    return weekOfDate.split(",");}public static String getWeekOfDate(int weekNo) {    Date date = new Date();    DateTime start = DateUtil.beginOfMonth(date); // 获取本月的第一天    DateTime end = DateUtil.endOfMonth(date); // 获取本月最后一天    String weekOfDate = getWeekOfDate(start, end,weekNo);    return weekOfDate;}public static String getWeekOfDate(Date start, Date end,int weekNo) {    Map<Integer, String> weekOfDate = getWeekOfDate(start, end);    return weekOfDate.get(weekNo);}public static  Map<Integer, String> getWeekOfDate(Date start, Date end) {    Map<Integer, String> result = new HashMap<>();    StringBuffer sb = null;    assert end != null;    assert start != null;    int weekNum = DateUtil.weekOfMonth(end); // 获取本月最后一天在第几周    System.out.println("指定日期所在月共有 "+weekNum+" 周");    Calendar cal = Calendar.getInstance();    // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一    cal.setFirstDayOfWeek(Calendar.MONDAY);    cal.setTime(start);    // 获得当前日期是一个星期的第几天    int dayWeek = cal.get(Calendar.DAY_OF_WEEK);    if (1 == dayWeek) {        cal.add(Calendar.DAY_OF_MONTH, -1);    }    for (int i = 1; i <= weekNum; i++) {        sb = new StringBuffer();        if (i == 1) {//第一周以 start 开始            sb.append(DateUtil.format(start,"yyyy-MM-dd"));        }else {            sb.append(DateUtil.format(cal.getTime(),"yyyy-MM-dd"));        }        sb.append(",");        if (i == weekNum) {//最后一周以 end 结束            sb.append(DateUtil.format(end,"yyyy-MM-dd"));        }else {            //设置这周的周日日期,1代表周日,取值范围1~7,设置1~7之外会从周日开始往前后推算,负前正后,DAY_OF_WEEK的日期变更范围只会是在当前日期的周            cal.set(Calendar.DAY_OF_WEEK,1);            sb.append(DateUtil.format(cal.getTime(),"yyyy-MM-dd"));        }        result.put(i,sb.toString());        //调用 org.apache.commons.lang.time.DateUtils 包下的方法        //新增一天到下一周的开始日期        cal.setTime(DateUtils.addDays(cal.getTime(), 1));    }    return result;}

这里参考文章:https://blog.csdn.net/qq_40579568/article/details/125547795

3、获取当前月某一周的所有日期

拿到某一周的起止时间后,我又需要获得这周的所有日期怎么办?

public static List<String> weekDay(String week){    String[] day = getStartEndOfWeek(week);    String[] split1 = day[0].split("-");    String[] split2 = day[1].split("-");    int start = Integer.parseInt(split1[2]);    int end = Integer.parseInt(split2[2]);    int month = Integer.parseInt(split1[1]);    List<String> list = new ArrayList<>();    for (int i = start; i <= end; i++) {        list.add(month+"月"+i+"日");    }    return list;}

4、多个日期中,计算最大的连续天数

除了上面获取每周起止日期外,还有个要求在多个日期中,计算最大的连续天数。
如:2023-01-01、2023-01-02、2023-01-10、2023-01-11、2023-01-12、2023-01-15 这几个日期中,最大的连续天数是3天。

public static int continuousDay(List<LocalDate> dateList){    if (dateList == null || dateList.size() ==0) {        return 0;    }    dateList = dateList.stream().sorted(LocalDate::compareTo).collect(Collectors.toList());    int maxContinuousDay = 1;    int continuousDay = 1;    for (int i = 0; i < dateList.size(); i++) {        if (i == dateList.size() -1){            break;        }        LocalDate date = dateList.get(i);        LocalDate secondDate = dateList.get(i + 1);        if (date.plusDays(1).equals(secondDate)){            continuousDay ++;        }else {            if (continuousDay > maxContinuousDay){                maxContinuousDay = continuousDay;            }            continuousDay = 1;        }    }    return maxContinuousDay;}

参考文章:https://blog.csdn.net/UserFrank/article/details/125186332

5、判断指定日期是否在某个范围内

这里可以直接用hutool的 DateUtil 工具类判断。除了这些,DateUtil、 LocalDateTimeUtil 还有很多实用的方法,可以去看看 源码

// date 指定日期; start 范围开始时间; end 范围结束时间。boolean in = DateUtil.isIn(date, start, end);

目前用到的暂时就这些,以后可能会补充,有小伙伴想补充的欢迎留言。

来源地址:https://blog.csdn.net/weixin_43165220/article/details/129245362

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯