输出指定日期区间内的所有天、周、月
部分方法需要依赖hutool工具包。
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.10</version>
</dependency>`
需求:输出2023-04-17到2023-05-23期间所有的天、周、月。
天:2023-04-17、2023-04-18、…2023-05-23
周:202317(第17周)、202318(第18周)…
周的范围(周日作为每周第一天):2023-04-17至2023-04-23、2023-04-24至2023-04-30…
周的范围(周一作为每周第一天):2023-04-23至2023-04-29、2023-04-30至2023-05-06…
月:2023-04、2023-05
输入输出yyyy-MM-dd格式
String startDateString = "2023-04-23";
String endDateString = "2023-05-07";
输出这两个日期之间所有的日期
输入输出yyyy-MM-dd格式
public static List<String> getDatesBetween(String startDateString, String endDateString) {List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.DAY_OF_MONTH);return datesBetween.stream().map(p -> DateUtil.format(p, DatePattern.NORM_DATE_PATTERN)).collect(Collectors.toList());
}
测试:
System.out.println("getDatesBetween:"+ JSON.toJSONString(getDatesBetween(startDateString,endDateString)));
输出:
getDatesBetween:["2023-04-23","2023-04-24","2023-04-25","2023-04-26","2023-04-27","2023-04-28","2023-04-29","2023-04-30","2023-05-01","2023-05-02","2023-05-03","2023-05-04","2023-05-05","2023-05-06","2023-05-07"]
输出这两个日期之间所有的周(数字)
比如:[“202318”,“202319”] 表示2023年第18、19周
public static List<String> getWeeksBetween(String startDateString, String endDateString) {// 这种情况必须重置结束日期,结束日期最好改成这周的最后一天,不然会丢失最后不足一周的数据endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);return datesBetween.stream().map(p -> String.format("%d%02d", DateUtil.year(p), DateUtil.weekOfYear(p))).collect(Collectors.toList());
}
我在测试的时候发现,如果结束日期不是这周的最后一天,它可能会少一周数据,所以直接重置结束日期。
测试:
System.out.println("getMonthsBetween:"+ JSON.toJSONString(getMonthsBetween(startDateString,endDateString)));
输出:
getWeeksBetween:["202317","202318","202319"]
输出这两个日期之间所有的周(周一为每周的第一天)
比如:[“2023-04-24至2023-04-30”,“2023-05-01至2023-05-07”]
public static List<String> getWeeksMonBetween(String startDateString, String endDateString) {return getWeeksBetween(startDateString, endDateString, Calendar.MONDAY);
}private static List<String> getWeeksBetween(String startDateString, String endDateString ,int firstDay) {Date startDate = DateUtil.parse(startDateString);Date endDate = DateUtil.parse(endDateString);List<String> weekStartDates = new ArrayList<>();Calendar calendar = Calendar.getInstance();calendar.setTime(startDate);while (calendar.getTime().compareTo(endDate) <= 0) {// 获取当前日期所在周的起始日期int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);int diff = (dayOfWeek - firstDay + 7) % 7;calendar.add(Calendar.DAY_OF_YEAR, -diff);String weekStart = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);// 获取当前日期所在周的结束日期calendar.add(Calendar.DAY_OF_YEAR, 6);String weekEnd = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);weekStartDates.add(weekStart + "至" + weekEnd);// 将日期移动到下一周的起始日期calendar.add(Calendar.DAY_OF_YEAR, 1);}return weekStartDates;
}
测试:
System.out.println("getWeeksMonBetween:"+ JSON.toJSONString(getWeeksMonBetween(startDateString,endDateString)));
输出:
getWeeksMonBetween:["2023-04-17至2023-04-23","2023-04-24至2023-04-30","2023-05-01至2023-05-07"]
输出这两个日期之间所有的周(周日为一周的第一天)
比如:[“2023-04-24至2023-04-30”,“2023-05-01至2023-05-07”]
public static List<String> getWeeksSunBetween(String startDateString, String endDateString) {return getWeeksBetween(startDateString, endDateString, Calendar.SUNDAY);
}
还是调用上边的方法,只是参数换成Calendar.SUNDAY
。
测试:
System.out.println("getWeeksSunBetween:"+ JSON.toJSONString(getWeeksSunBetween(startDateString,endDateString)));
输出:
getWeeksSunBetween:["2023-04-23至2023-04-29","2023-04-30至2023-05-06","2023-05-07至2023-05-13"]
输出这两个日期之间所有的月
比如:[“2023-04”,“2023-05”]
public static List<String> getMonthsBetween(String startDateString, String endDateString) {// 这种情况必须重置结束日期,结束日期最好改成这月的最后一天endDateString = DateUtil.format(DateUtil.endOfMonth(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.MONTH);return datesBetween.stream().map(p -> DateUtil.format(p, "yyyy-MM")).collect(Collectors.toList());
}
测试:
System.out.println("getMonthsBetween:"+ JSON.toJSONString(getMonthsBetween(startDateString,endDateString)));
输出:
getMonthsBetween:["2023-04","2023-05"]
输出这两个日期之间所有的周(周一为每周的第一天)方案B
private static List<String> getWeeksMonBetweenPlanB(String startDateString, String endDateString) {// 这种情况必须重置结束日期,结束日期最好改成这周的最后一天endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);return datesBetween.stream().map(p -> {String startOfWeek = DateUtil.format(DateUtil.beginOfWeek(p), DatePattern.NORM_DATE_PATTERN);String endOfWeek = DateUtil.format(DateUtil.endOfWeek(p), DatePattern.NORM_DATE_PATTERN);return startOfWeek + "至" + endOfWeek;}).collect(Collectors.toList());
}
测试:
System.out.println("getWeeksMonBetweenPlanB:"+ JSON.toJSONString(getWeeksMonBetweenPlanB(startDateString,endDateString)));
输出:
getWeeksMonBetweenPlanB:["2023-04-17至2023-04-23","2023-04-24至2023-04-30","2023-05-01至2023-05-07"]
完整工具类
package com.test.util;import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;/*** @Description: 日期范围工具* @title: DateRangeUtil* @Date: 2023/5/23 16:06* @Version 1.0*/
public class DateRangeUtil {/*** 输出这两个日期之间所有的日期 yyyy-MM-dd格式* @param startDateString* @param endDateString* @return*/public static List<String> getDatesBetween(String startDateString, String endDateString) {List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.DAY_OF_MONTH);return datesBetween.stream().map(p -> DateUtil.format(p, DatePattern.NORM_DATE_PATTERN)).collect(Collectors.toList());}/*** 输出这两个日期之间所有的周(数字) 比如:["202318","202319"] 表示2023年第18、19周* @param startDateString* @param endDateString* @return*/public static List<String> getWeeksBetween(String startDateString, String endDateString) {// 这种情况必须重置结束日期,结束日期最好改成这周的最后一天,不然会丢失最后不足一周的数据endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);return datesBetween.stream().map(p -> String.format("%d%02d", DateUtil.year(p), DateUtil.weekOfYear(p))).collect(Collectors.toList());}/*** 输出这两个日期之间所有的周(周一为一周的第一天) 比如:["2023-04-24至2023-04-30","2023-05-01至2023-05-07"]* @param startDateString* @param endDateString* @return*/public static List<String> getWeeksMonBetween(String startDateString, String endDateString) {return getWeeksBetween(startDateString, endDateString, Calendar.MONDAY);}/*** 输出这两个日期之间所有的周(周日为一周的第一天) 比如:["2023-04-24至2023-04-30","2023-05-01至2023-05-07"]* @param startDateString* @param endDateString* @return*/public static List<String> getWeeksSunBetween(String startDateString, String endDateString) {return getWeeksBetween(startDateString, endDateString, Calendar.SUNDAY);}private static List<String> getWeeksBetween(String startDateString, String endDateString ,int firstDay) {Date startDate = DateUtil.parse(startDateString);Date endDate = DateUtil.parse(endDateString);List<String> weekStartDates = new ArrayList<>();Calendar calendar = Calendar.getInstance();calendar.setTime(startDate);while (calendar.getTime().compareTo(endDate) <= 0) {// 获取当前日期所在周的起始日期int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);int diff = (dayOfWeek - firstDay + 7) % 7;calendar.add(Calendar.DAY_OF_YEAR, -diff);String weekStart = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);// 获取当前日期所在周的结束日期calendar.add(Calendar.DAY_OF_YEAR, 6);String weekEnd = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);weekStartDates.add(weekStart + "至" + weekEnd);// 将日期移动到下一周的起始日期calendar.add(Calendar.DAY_OF_YEAR, 1);}return weekStartDates;}/*** 输出这两个日期之间所有的月 比如:["2023-04","2023-05"]* @param startDateString* @param endDateString* @return*/public static List<String> getMonthsBetween(String startDateString, String endDateString) {// 这种情况必须重置结束日期,结束日期最好改成这月的最后一天endDateString = DateUtil.format(DateUtil.endOfMonth(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.MONTH);return datesBetween.stream().map(p -> DateUtil.format(p, "yyyy-MM")).collect(Collectors.toList());}// B方案 未使用private static List<String> getWeeksMonBetweenPlanB(String startDateString, String endDateString) {// 这种情况必须重置结束日期,结束日期最好改成这周的最后一天endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);return datesBetween.stream().map(p -> {String startOfWeek = DateUtil.format(DateUtil.beginOfWeek(p), DatePattern.NORM_DATE_PATTERN);String endOfWeek = DateUtil.format(DateUtil.endOfWeek(p), DatePattern.NORM_DATE_PATTERN);return startOfWeek + "至" + endOfWeek;}).collect(Collectors.toList());}public static void main(String[] args) {String startDateString = "2023-04-23";String endDateString = "2023-05-07";System.out.println("getDatesBetween:"+ JSON.toJSONString(getDatesBetween(startDateString,endDateString)));System.out.println("getWeeksMonBetween:"+ JSON.toJSONString(getWeeksMonBetween(startDateString,endDateString)));System.out.println("getWeeksSunBetween:"+ JSON.toJSONString(getWeeksSunBetween(startDateString,endDateString)));System.out.println("getWeeksBetween:"+ JSON.toJSONString(getWeeksBetween(startDateString,endDateString)));System.out.println("getMonthsBetween:"+ JSON.toJSONString(getMonthsBetween(startDateString,endDateString)));System.out.println("getWeeksMonBetweenPlanB:"+ JSON.toJSONString(getWeeksMonBetweenPlanB(startDateString,endDateString)));}}
相关文章:
输出指定日期区间内的所有天、周、月
部分方法需要依赖hutool工具包。 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.10</version> </dependency>需求:输出2023-04-17到2023-05-23期间所有的天、周、月。…...

【线性规划模型】
线性规划模型:原理介绍和预测应用 引言 线性规划是运筹学中一种重要的数学优化方法,被广泛应用于各个领域,包括工业、经济、物流等。 线性规划模型的原理 线性规划模型的目标是在一组线性约束条件下,寻找一组变量的最优解&…...
android 12.0卸载otg设备开机不加载otg设备
1.概述 在12.0定制化开发过程中,客户有功能需求,通过系统属性值控制是否加载挂载otg设备,当设置为卸载模式时,要求不能挂载otg设备,开机也不能挂载otg设备 2.卸载otg设备开机不加载otg设备的核心代码 frameworks/base/services/core/java/com/android/server/StorageMan…...

通过 Wacom 的 Project Mercury 提高远程办公效率
过去几年中,我们的工作方式发生了翻天覆地的变化。疫情加快了对远程办公和协作的采纳,导致人们更加依赖技术来联系团队和提高工作效率。 但是,那些依靠专门硬件和软件来完成工作的创作者呢?艺术家、设计师和开发人员需要使用专门…...

Linux-0.11 文件系统namei.c详解
Linux-0.11 文件系统namei.c详解 模块简介 namei.c是整个linux-0.11版本的内核中最长的函数,总长度为700行。其核心是namei函数,即根据文件路径寻找对应的i节点。 除此以外,该模块还包含一些创建目录,删除目录,创建目…...
计算机网络学习笔记
<!-- GFM-TOC --> 计算机网络体系结构 传输层:TCP和UDP 什么是三次握手? 什么是四次挥手? TCP如何实现流量控制? TCP的拥塞控制是怎么实现的? TCP如何最大利用带宽? TCP与UDP的区别 TCP如何保…...
Pod相关操作命令
Pod相关操作命令 Pod setup # CocoaPods 将信息下载到~/.cocoapods/repos 目录下。如果安装 CocoaPods 时不执行此命令,在初次执行pod intall 命令时,系统也会自动执行该指令 pod --version # 检查 CocoaPods 是否安装成功及其版本号 pod repo update #…...

图灵完备游戏:信号计数 解法记录
使用1个全加器 2个半加器完成。这关的思想主旨在于如何把输出4,输出2,输出1的情况统一在一根导线上。 首先用一个全加器来完成输入2-4这三个引脚的计数,因为全加器输出范围二进制是00 - 11,而输入正好有两个引脚数位是2和1&…...

数据结构图的基础概念
1、图的概念 图(Graph):是由顶点的有穷非空集合和顶点之间边的集合组成。顶点(Vertex):图中的数据元素。边(Edge):顶点之间的逻辑关系,边可以是有向的或无向的,也可以带有权重(可以表示距离,花费等…...

一场九年前的“出发”:奠基多模态,逐鹿大模型
原创:谭婧 全球AI大模型的技术路线,没有多少秘密,就那几条路线,一只手都数得过来。 而举世闻名的GPT-4浑身上下都是秘密。 这两件事并不矛盾。为什么呢? 这就好比,回答“如何制造一台光刻机?”。…...
什么是url跳转漏洞?
什么是url跳转漏洞 简介原因:如何防止 简介 URL跳转漏洞是一种Web应用程序安全问题,指的是在应用程序处理URL跳转时,由于程序员的疏忽或设计不当,攻击者可能通过构造恶意URL来实现对应用程序的攻击。 原因: 跳转条件…...
生物学经典blast比对算法,R语言和Python如何实现?
Blast比对算法原理与实现方式 做生物的同学肯定听说过blast比对这个方法,一般在NCBI等网站上可以在线进行比对,也可以在本地服务器进行比对,那么blast算法究竟是怎么实现对不同序列的比对呢? 本文分享经典blast算法的基础原理&…...
Android 开机动画支持mp4格式视频播放
前 言 Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。 自定义…...

软考A计划-试题模拟含答案解析-卷十
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...

Kafka入门(安装和SpringBoot整合)
文章目录 一、Docker安装Kafka1. 创建网络2. 安装zookeeper3. 安装Kafka 二、Kafka介绍1. Kafka简介 三、SpringBoot整合Kafka1. 引入pom依赖2. application.propertise配置3. Hello Kafka(Producer)4. Consumer Kafka5. 带回调的生产者6. 自定义分区器7. kafka事务提交8. 指定…...
gitLab相关命令
gitLab相关命令 1) 远程仓库相关命令 git clone 远程仓库地址 #检出仓库git remote -v #查看远程仓库git remote add [name][url] #添加远程仓库,git remote add origin 远程仓库地址git remote rm [name] #删除远程仓库,git remote rm origingit remo…...
一些查看日志时的常用命令
文章目录 1、grep -r 搜索内容 *2、l * 关键字 *3、tail -f 文件名4、tail -n X 文件名5、cat 文件名 | grep "关键字" -C X同理可得,-A同理可得,-B 一些查看日志时的常用命令 1、grep -r 搜索内容 * 作用:在一堆文件里࿰…...
Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链。函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境。全局执行环境只能访问全局执行…...
CRDT协同算法
CRDT的英文全称是Conflict-free Replicated Data Type,最初是由协同文本编辑和移动计算而发展的,现在还被用作在线聊天系统、音频分发平台等等。当前CRDT算法在富文本编辑器领域的协同依旧是典型的场景,常用于作为实现文档协同的底层算法&…...
近代中国的三次思想文化运动
1、戊戌变法中维新派顽固派论战 第一次思想解放潮流是1898年维新派与顽固势力的论战。论战的内容有:要不要变法,要不要兴民权、实行君主立宪,要不要提倡西学、改变教育制度。此次论争是资本主义思想同封建主义思想的正面交锋,此后…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...