输出指定日期区间内的所有天、周、月
部分方法需要依赖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年维新派与顽固势力的论战。论战的内容有:要不要变法,要不要兴民权、实行君主立宪,要不要提倡西学、改变教育制度。此次论争是资本主义思想同封建主义思想的正面交锋,此后…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
