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

news2025/2/22 18:16:31

目录

  • 前言
  • 实现
    • 1、获取当月的所有周
    • 2、根据指定的第几周,获取这周的开始、结束时间
    • 3、获取当前月某一周的所有日期
    • 4、多个日期中,计算最大的连续天数
    • 5、判断指定日期是否在某个范围内

前言

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

实现

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

<!-- hutool工具类 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</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、根据指定的第几周,获取这周的开始、结束时间

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

/**
 * 根据指定的第几周,获取这周的开始、结束时间
 * @param week 第几周(比如第1周、第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(",");
}

/**
 * 指定周数,获取当前月本周的开始、结束时间
 * @param weekNo 第几周
 */
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;
}

/**
 * 指定时间计算有几周,并返回每周起止日期
 * @param start 开始时间(本月第一天)
 * @param end 结束时间(本月最后一天)
 * @param weekNo 第几周
 */
public static String getWeekOfDate(Date start, Date end,int weekNo) {
    Map<Integer, String> weekOfDate = getWeekOfDate(start, end);
    return weekOfDate.get(weekNo);
}

/**
 * 指定时间计算有几周,并返回每周起止日期(这里也可以不用放到map中,直接返回某一周的起止时间就行)
 * @param start 开始时间
 * @param end 结束时间
 * @return week:第几周 start:每周开始时间 end:每周结束时间
 */
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、获取当前月某一周的所有日期

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

/**
 * 获取当前月某一周的所有日期
 * @param week 第几周
 */
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天。

/**
 * 多个日期中,计算最大的连续天数
 * 例如: [1,2,3,5,7]  则判定为连续有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);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网vCenter部署教程二,最全的了!

一、组网说明 vCenter组网最佳实践 每台服务器需要6个网口,需要三个分布式交换机,每个交换机分配2个物理网卡做冗余,分别做为管理网络、业务网络、高可用网络使用。另vsan网络和vmotion网络可以复用业务网络或管理网络,vcenter HA需要单独用一个网络。 二、创建管理网络…

Ubuntu通过rsync和inotify实现双机热备

Rsync Inotify双机热备 一、备份机操作 备份机&#xff1a;主服务器或主机文件将需要备份的文件同步到此服务器上&#xff0c;即从主服务器上同步过来进行备份。 1.1安装rsync sudo apt-get install rsync1.2修改/etc/dault/rsync文件 sudo vim /etc/default/rsync修改如…

二叉树——修剪二叉搜索树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

GPT:通用预训练语言模型

论文标题&#xff1a;Improving Language Understanding by Generative Pre-Training论文链接&#xff1a;https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf论文来源&#xff1a;OpenAI一、概述从无标注文本中高效学习的能力对于缓解对监督学习的依赖…

PLUMBER Boosting the Propagation of Vulnerability Fixes in the npm Ecosystem

PLUMBER: Boosting the Propagation of Vulnerability Fixes in the npm Ecosystem 1.背景 npm是JavaScript编程语言中最大的生态系统&#xff0c;截至2022年1月&#xff0c;它拥有超过180万个第三方软件包。2017年11月2日的npm快照进行的调查显示&#xff0c;在610,097个包中…

从16K跳槽到20K,最后算下来年薪却还降了,我笑了····

跳槽时薪资涨了 4000&#xff0c;但年薪总包算下来反而变少了&#xff0c;这是怎么回事&#xff1f; 上周&#xff0c;我星球里一个同学就遇到了这么一个问题&#xff0c;薪资涨了、总包降了&#xff0c;而且谈薪时把自己坑了。 作为一个案例&#xff0c;我觉得对很多人可能会…

【项目设计】高并发内存池 (四)[pagecache实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

数据结构:堆的实现与建堆时间复杂度分析

目录 前言 一.堆的介绍 1.堆的本质 2.堆的分类 二.堆的实现(以小根堆为例) 1.关于二叉树的两组重要结论&#xff1a; 2.堆的物理存储结构框架(动态数组的简单构建) 3. 堆元素插入接口(以小根堆为例) 堆尾元素向上调整的算法接口: 4.堆元素插入接口测试 5.堆元素插入…

【chatgpt】教你如何创建一个Vue脚手架

要创建一个Vue脚手架&#xff0c;您可以使用Vue CLI。Vue CLI是一个命令行工具&#xff0c;可帮助您快速创建Vue项目并提供开发环境。 以下是使用Vue CLI创建Vue脚手架的步骤&#xff1a; 首先&#xff0c;您需要安装Node.js。您可以在Node.js官网上下载和安装它。安装Vue CL…

计网面试题-在浏览器中输入url地址到显示主页的过程

先说答案哈 1DNS解析( DNS解析就是把一个域名转换成一个IP地址。)1&#xff09;、先到浏览器的DNS缓存中查询是否有对应记录&#xff0c;如有则直接返回ip地址&#xff0c;完成解析&#xff0c;如果没有则下一步&#xff1b;2&#xff09;、继续查询本地host文件&#xff0c;…

TIA博途中通过SCL语言实现快速排序的具体方法示例

TIA博途中通过SCL语言实现快速排序的具体方法示例 首先,了解一下快速排序的原理: 排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要将这个待排序的数列…

Python开发之Python导包的几种方法,自定义包的生成以及导入详解

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越多被用于独立的、大型项目的开发。 下面介绍python的几种…

网络协议---TCP和UDP

文章目录TCPTCP简介内容TCP三次握手建立连接TCP四次挥手断开连接常见面试题TCP连接资源UDPUDP简介内容TCP TCP简介内容 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c…

MySQL-DQL语句

DQL语句 DQL&#xff08;Data Query Language&#xff09;查询数据 操作查询&#xff1a;select简单的查询&#xff0c;复杂的查询数据库中最核心的语言&#xff0c;最重要的语句使用频繁的语句 指定查询 查询全部 语法&#xff1a; select 全部字段&#xff08;*&#x…

全流程基于最新导则下的生态环境影响评价技术方法及图件制作与案例实践

根据最新生态环境影响评价导则&#xff0c;结合生态环评内容庞杂、综合性强的特点&#xff0c;以既包括陆域、又包括水域的项目为主要案例&#xff0c;对生态环评的具体流程及所需内容进行系统阐述。利用Rstudio、Fragstats等软件分析计算生态环评中所需各种指数&#xff0c;利…

项目管理工具dhtmlxGantt甘特图入门教程(十五):从MS项目导入/导出(下)

这篇文章给大家讲解dhtmlxGantt请求大文件导入的大小限制。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun 764148812&#xff09;https:…

【算法数据结构体系篇class10、11】:二叉树

一、二叉树的先序、中序、后序遍历先序&#xff1a;任何子树的处理顺序都是&#xff0c;先头节点、再左子树、然后右子树中序&#xff1a;任何子树的处理顺序都是&#xff0c;先左子树、再头节点、然后右子树后序&#xff1a;任何子树的处理顺序都是&#xff0c;先左子树、再右…

基于tsfresh包的单类时间序列特征提取

前言 时间序列特征提取包中tsfresh较为流行&#xff0c;但是其官方教程给出的例子是机器人故障的数据集&#xff0c;其中的id列为各组不同的实验。然后我就一直在想能否做单类的&#xff0c;比如电力预测&#xff0c;或者是某一条街道的交通预测&#xff0c;但是翻遍了文档都没…

Linux安装nginx详细步骤

1.安装依赖包//一键安装上面四个依赖yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载并解压安装包//创建一个文件夹 mkdir /usr/local/nginx cd /usr/local/nginx //下载tar包 wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -xvf nginx…

蓝牙调试工具集合汇总

BLE 该部分主要分享一下常用的蓝牙调试工具&#xff0c;方便后续蓝牙抓包及分析。 目录 1 hciconfig 2 hcitool 3 hcidump 4 hciattach 5 btmon 6 bluetoothd 7 bluetoothctl 1 hciconfig 工具介绍&#xff1a;hciconfig&#xff0c;HCI 设备配置工具 命令格式&…