java定时任务 设置开始时间、结束时间;每周一、四、六执行;并且隔n周执行。最后计算所有执行时间

java定时任务 设置开始时间、结束时间;每周一、四、六执行;并且隔n周执行。最后计算所有执行时间)

    • 定时任务需求
    • 程序设计
    • 依赖引入
    • 程序
      • 一、计算开始时间那周的周一时间
      • 二、根据executeTime和weekList.get(n),计算每个cron表达式。
      • 三、根据一和二得出的cron表达式和开始时间的那周的周一时间,计算每次定时任务执行的第一次时间。
      • 四、计算所有执行时间
      • 五、测试
      • 六、测试结果
    • 最终代码:

定时任务需求

在一个特殊的项目需求中,我们设计一个定时任务,并算出它所有的执行时间点。

1.有开始时间和结束时间。
2.每周一、四、六执行(动态参数) 执行的时和分HH:mm(动态参数)
3.隔n周执行(动态参数)
4.算每次执行时间。

程序设计

参数类型说明
定时任务开始时间startTimeyyyy-MM-dd
定时任务结束时间endTimeyyyy-MM-dd
执行时间executeTimeHH:mm
周几执行列表weekList: [0,1,2,3,4,5,6] 代表:[周日,周一,周二,周三,周四,周五,周六]cron中 [1,2,3,4,5,6,7] 代表:[周日,周一,周二,周三,周四,周五,周六]
隔几周执行一次interval数字n

依赖引入

        <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency>

程序

一、计算开始时间那周的周一时间

考虑隔周执行,一定要以开始时间那个周的周一为起点,否则时间会算错。

 /*** 开始时间点的周一时间* @param startDate* @return*/public static Date getMonday(Date startDate){/*** 计算给出时间的周一时间*/Calendar calendar = Calendar.getInstance();calendar.setTime(startDate);// 将小时、分钟、秒和毫秒字段设置为0calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);// 将日期设置为本周第一天(默认为周日)的前一天(即周一)calendar.add(Calendar.DAY_OF_WEEK, Calendar.MONDAY - calendar.get(Calendar.DAY_OF_WEEK));// 输出周一0点的时间return calendar.getTime();}

二、根据executeTime和weekList.get(n),计算每个cron表达式。

/***计算cron表达式*@param executeTime  执行时间 HH:mm* @param week   周几* @return cron表达式* @throws ParseException*/public static String createCronStr(String executeTime, Integer week)  {String weekStr = String.valueOf(week + 1);// 设置cron表达式,周三,下午3点30分执行String cronExpression = "0 %1$s %2$s ? * %3$s";String[] times = executeTime.split(":");String hour = times[0];String minute = times[1];return String.format(cronExpression, minute, hour, weekStr);}

三、根据一和二得出的cron表达式和开始时间的那周的周一时间,计算每次定时任务执行的第一次时间。

    /*** 计算下次执行时间* @param cronExpression cron* @param startTime2  开始时间(开始时间的周一时间)* @return* @throws ParseException*/public static  Date getNextExecutionTime(String cronExpression, Date startTime2) throws ParseException {CronExpression cron = new CronExpression(cronExpression);Date nextExecutionTime = cron.getNextValidTimeAfter(startTime2);System.out.println("下次执行时间: " + nextExecutionTime);return nextExecutionTime;}

四、计算所有执行时间

 /**** @param startTime  定时任务开始时间  yyyy-MM-dd* @param endTime    定时任务结束时间  yyyy-MM-dd* @param executeTime  执行时间 HH:mm* @param weekList   周几执行列表  [0,1,2,3,4,5,6] 代表:[周日,周一,周二,周三,周四,周五,周六]* @param interval   隔几周执行一次* @return*/public static List<String> getExecuteTimeList(String startTime, String endTime, String executeTime, List<Integer> weekList, int interval) {List<String> list = new ArrayList<>();try {String startStr = startTime + executeTime;String endStr = endTime + executeTime;SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-ddHH:mm");Date endDate = dateFormat.parse(endStr);Date startDate = dateFormat.parse(startStr);Date now = new Date();//设置日期过期,返回空if (now.getTime() > endDate.getTime()) {return new ArrayList<>();}interval++;for (Integer week : weekList) {String cronExpression = createCronStr(executeTime, week);if (StringUtils.isBlank(cronExpression)) {continue;}Date startTime2 = getMonday(startDate);Date nextExecutionTime = getNextExecutionTime(cronExpression,startTime2);int add = 0;Date nownext = nextExecutionTime;while (nownext.getTime() <= endDate.getTime()) {nownext = new Date(nextExecutionTime.getTime() + add * interval * 7 * 24 * 60 * 60 * 1000L);SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");String str = dateFormat2.format(nownext);if (nownext.getTime() <= endDate.getTime() && nownext.getTime()>=startDate.getTime())  {list.add(str);}add++;}}Collections.sort(list);} catch (ParseException e) {System.out.println("解析异常: " + e.getMessage());e.printStackTrace();}return list;}

五、测试

计算2024-06-15到2026-12-31,每周一、四、六的20:40,并隔一周执行一次的所有执行时间


public static void main(String[] args) {List<Integer> week = new ArrayList<>();week.add(1);week.add(4);week.add(6);long start = System.currentTimeMillis();List<String> list = getExecuteTimeList("2024-06-15", "2026-12-31", "20:40", week, 1);long end = System.currentTimeMillis();System.out.println(end - start + " ms");for(String element : list) {System.out.println(element);}}

六、测试结果

下次执行时间: Mon Jun 10 20:40:00 CST 2024
下次执行时间: Thu Jun 13 20:40:00 CST 2024
下次执行时间: Sat Jun 15 20:40:00 CST 2024
74 ms
2024-06-15 20:40
2024-06-24 20:40
2024-06-27 20:40
2024-06-29 20:40
2024-07-08 20:40
2024-07-11 20:40
2024-07-13 20:40
2024-07-22 20:40
2024-07-25 20:40
2024-07-27 20:40
2024-08-05 20:40
2024-08-08 20:40
2024-08-10 20:40
2024-08-19 20:40
2024-08-22 20:40
2024-08-24 20:40
2024-09-02 20:40
2024-09-05 20:40
2024-09-07 20:40
2024-09-16 20:40
2024-09-19 20:40
2024-09-21 20:40
2024-09-30 20:40
2024-10-03 20:40
2024-10-05 20:40
2024-10-14 20:40
2024-10-17 20:40
2024-10-19 20:40
2024-10-28 20:40
2024-10-31 20:40
2024-11-02 20:40
2024-11-11 20:40
2024-11-14 20:40
2024-11-16 20:40
2024-11-25 20:40
2024-11-28 20:40
2024-11-30 20:40
2024-12-09 20:40
2024-12-12 20:40
2024-12-14 20:40
2024-12-23 20:40
2024-12-26 20:40
2024-12-28 20:40
2025-01-06 20:40
2025-01-09 20:40
2025-01-11 20:40
2025-01-20 20:40
2025-01-23 20:40
2025-01-25 20:40
2025-02-03 20:40
2025-02-06 20:40
2025-02-08 20:40
2025-02-17 20:40
2025-02-20 20:40
2025-02-22 20:40
2025-03-03 20:40
2025-03-06 20:40
2025-03-08 20:40
2025-03-17 20:40
2025-03-20 20:40
2025-03-22 20:40
2025-03-31 20:40
2025-04-03 20:40
2025-04-05 20:40
2025-04-14 20:40
2025-04-17 20:40
2025-04-19 20:40
2025-04-28 20:40
2025-05-01 20:40
2025-05-03 20:40
2025-05-12 20:40
2025-05-15 20:40
2025-05-17 20:40
2025-05-26 20:40
2025-05-29 20:40
2025-05-31 20:40
2025-06-09 20:40
2025-06-12 20:40
2025-06-14 20:40
2025-06-23 20:40
2025-06-26 20:40
2025-06-28 20:40
2025-07-07 20:40
2025-07-10 20:40
2025-07-12 20:40
2025-07-21 20:40
2025-07-24 20:40
2025-07-26 20:40
2025-08-04 20:40
2025-08-07 20:40
2025-08-09 20:40
2025-08-18 20:40
2025-08-21 20:40
2025-08-23 20:40
2025-09-01 20:40
2025-09-04 20:40
2025-09-06 20:40
2025-09-15 20:40
2025-09-18 20:40
2025-09-20 20:40
2025-09-29 20:40
2025-10-02 20:40
2025-10-04 20:40
2025-10-13 20:40
2025-10-16 20:40
2025-10-18 20:40
2025-10-27 20:40
2025-10-30 20:40
2025-11-01 20:40
2025-11-10 20:40
2025-11-13 20:40
2025-11-15 20:40
2025-11-24 20:40
2025-11-27 20:40
2025-11-29 20:40
2025-12-08 20:40
2025-12-11 20:40
2025-12-13 20:40
2025-12-22 20:40
2025-12-25 20:40
2025-12-27 20:40
2026-01-05 20:40
2026-01-08 20:40
2026-01-10 20:40
2026-01-19 20:40
2026-01-22 20:40
2026-01-24 20:40
2026-02-02 20:40
2026-02-05 20:40
2026-02-07 20:40
2026-02-16 20:40
2026-02-19 20:40
2026-02-21 20:40
2026-03-02 20:40
2026-03-05 20:40
2026-03-07 20:40
2026-03-16 20:40
2026-03-19 20:40
2026-03-21 20:40
2026-03-30 20:40
2026-04-02 20:40
2026-04-04 20:40
2026-04-13 20:40
2026-04-16 20:40
2026-04-18 20:40
2026-04-27 20:40
2026-04-30 20:40
2026-05-02 20:40
2026-05-11 20:40
2026-05-14 20:40
2026-05-16 20:40
2026-05-25 20:40
2026-05-28 20:40
2026-05-30 20:40
2026-06-08 20:40
2026-06-11 20:40
2026-06-13 20:40
2026-06-22 20:40
2026-06-25 20:40
2026-06-27 20:40
2026-07-06 20:40
2026-07-09 20:40
2026-07-11 20:40
2026-07-20 20:40
2026-07-23 20:40
2026-07-25 20:40
2026-08-03 20:40
2026-08-06 20:40
2026-08-08 20:40
2026-08-17 20:40
2026-08-20 20:40
2026-08-22 20:40
2026-08-31 20:40
2026-09-03 20:40
2026-09-05 20:40
2026-09-14 20:40
2026-09-17 20:40
2026-09-19 20:40
2026-09-28 20:40
2026-10-01 20:40
2026-10-03 20:40
2026-10-12 20:40
2026-10-15 20:40
2026-10-17 20:40
2026-10-26 20:40
2026-10-29 20:40
2026-10-31 20:40
2026-11-09 20:40
2026-11-12 20:40
2026-11-14 20:40
2026-11-23 20:40
2026-11-26 20:40
2026-11-28 20:40
2026-12-07 20:40
2026-12-10 20:40
2026-12-12 20:40
2026-12-21 20:40
2026-12-24 20:40
2026-12-26 20:40Process finished with exit code 0

最终代码:


import org.apache.commons.lang.StringUtils;
import org.quartz.CronExpression;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;/*** @author dume* @ClassName CronUtils* @description: TODO* @date 2024年06月06日* @version: 1.0*/
public class CronUtils {/**** @param startTime  定时任务开始时间  yyyy-MM-dd* @param endTime    定时任务结束时间  yyyy-MM-dd* @param executeTime  执行时间 HH:mm* @param weekList   周几执行列表  [0,1,2,3,4,5,6] 代表:[周日,周一,周二,周三,周四,周五,周六]* @param interval   隔几周执行一次* @return*/public static List<String> getExecuteTimeList(String startTime, String endTime, String executeTime, List<Integer> weekList, int interval) {List<String> list = new ArrayList<>();try {String startStr = startTime + executeTime;String endStr = endTime + executeTime;SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-ddHH:mm");Date endDate = dateFormat.parse(endStr);Date startDate = dateFormat.parse(startStr);Date now = new Date();//设置日期过期,返回空if (now.getTime() > endDate.getTime()) {return new ArrayList<>();}interval++;for (Integer week : weekList) {String cronExpression = createCronStr(executeTime, week);if (StringUtils.isBlank(cronExpression)) {continue;}Date startTime2 = getMonday(startDate);Date nextExecutionTime = getNextExecutionTime(cronExpression,startTime2);int add = 0;Date nownext = nextExecutionTime;while (nownext.getTime() <= endDate.getTime()) {nownext = new Date(nextExecutionTime.getTime() + add * interval * 7 * 24 * 60 * 60 * 1000L);SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");String str = dateFormat2.format(nownext);if (nownext.getTime() <= endDate.getTime() && nownext.getTime()>=startDate.getTime())  {list.add(str);}add++;}}Collections.sort(list);} catch (ParseException e) {System.out.println("解析异常: " + e.getMessage());e.printStackTrace();}return list;}/***计算cron表达式*@param executeTime  执行时间 HH:mm* @param week   周几* @return cron表达式* @throws ParseException*/public static String createCronStr(String executeTime, Integer week)  {String weekStr = String.valueOf(week + 1);// 设置cron表达式,周三,下午3点30分执行String cronExpression = "0 %1$s %2$s ? * %3$s";String[] times = executeTime.split(":");String hour = times[0];String minute = times[1];return String.format(cronExpression, minute, hour, weekStr);}/*** 计算下次执行时间* @param cronExpression cron* @param startTime2  开始时间(开始时间的周一时间)* @return* @throws ParseException*/public static  Date getNextExecutionTime(String cronExpression, Date startTime2) throws ParseException {CronExpression cron = new CronExpression(cronExpression);Date nextExecutionTime = cron.getNextValidTimeAfter(startTime2);System.out.println("下次执行时间: " + nextExecutionTime);return nextExecutionTime;}/*** 开始时间点的周一时间* @param startDate* @return*/public static Date getMonday(Date startDate){/*** 计算给出时间的周一时间*/Calendar calendar = Calendar.getInstance();calendar.setTime(startDate);// 将小时、分钟、秒和毫秒字段设置为0calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);// 将日期设置为本周第一天(默认为周日)的前一天(即周一)calendar.add(Calendar.DAY_OF_WEEK, Calendar.MONDAY - calendar.get(Calendar.DAY_OF_WEEK));// 输出周一0点的时间return calendar.getTime();}public static void main(String[] args) {List<Integer> week = new ArrayList<>();week.add(1);week.add(4);week.add(6);long start = System.currentTimeMillis();List<String> list = getExecuteTimeList("2024-06-15", "2026-12-31", "20:40", week, 1);long end = System.currentTimeMillis();System.out.println(end - start + " ms");for(String element : list) {System.out.println(element);}}}

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

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

相关文章

可以自定义的文字识别OCR

可以自定义的文字识别OCR 什么是OCR文档自学习自定义模板单证票据信息抽取操作体验 这里提到的可以自定义的文字识别OCR &#xff0c;其实就是OCR文档自学习。 什么是OCR文档自学习 什么是OCR文档自学习呢&#xff1f;OCR文档自学习&#xff0c;是面向“无算法基础”的企业与个…

C#——字典diction详情

字典 字典: 包含一个key(键)和这个key所以对应的value&#xff08;值&#xff09;&#xff0c;字典是是无序的&#xff0c;key是唯一的&#xff0c;可以根据key获取值。 定义字典: new Diction<key的类型&#xff0c;value的类型>() 方法 添加 var dic new Dictionar…

[EFI]NUC11电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 英特尔 NUC11DBBi9&#xff08;LPC Controller WM590芯片组&#xff09; 处理器 11th Gen Intel Core i9-11900KB 3.30GHz 八核 已驱动内存32 GB ( 三星 DDR4 3200MHz 16GB x 2 )已驱动硬盘三星 MZVL21T0HCLR-00B00 (1024 GB / 固态硬盘)已驱动显卡AMD R…

OZON芒果店长erp,OZON平台支持什么ERP

在跨境电商的浪潮中&#xff0c;OZON平台凭借其独特的优势&#xff0c;吸引了众多卖家入驻。然而&#xff0c;随着业务规模的不断扩大&#xff0c;如何高效管理商品、处理订单、优化仓储物流等成为了卖家们亟需解决的问题。此时&#xff0c;一款强大的ERP&#xff08;企业资源规…

代码随想录训练营第六天 454四数相加II 383赎金信 15三数之和 18四数之和

第一题&#xff1a; 原题链接&#xff1a;454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 将四个数组分成两两 两个组合&#xff0c;先对前面两个数组进行操作 定义unordered_map<int, int> map,将第一个和第二个数组中的元素相加并填入…

线性代数|机器学习-P13计算特征值和奇异值

文章目录 1. 特征值1.1 特征值求解思路1.1 相似矩阵构造 1. 特征值 1.1 特征值求解思路 我们想要计算一个矩阵的特征值&#xff0c;一般是用如下公式&#xff1a; ∣ ∣ A − λ I ∣ ∣ 0 → λ 1 , λ 2 , ⋯ , λ n \begin{equation} ||A-\lambda I||0\rightarrow \lamb…

汇聚荣科技有限公司实力强吗?

汇聚荣科技有限公司实力强吗?在当今快速发展的科技行业中&#xff0c;公司的实力往往决定了其市场竞争力和发展前景。对于汇聚荣科技有限公司而言&#xff0c;其是否具备强大的实力&#xff0c;不仅关系到自身的发展&#xff0c;也影响着投资者和合作伙伴的选择。因此&#xf…

植物大战僵尸杂交版2.1版本重磅发布!更新内容介绍讲解

植物大战僵尸杂交版2.1版&#xff0c;简直是游戏迷们的福音&#xff01;这个版本不仅更新了大量的新植物和僵尸角色&#xff0c;还加入了更多的游戏模式和挑战关卡&#xff0c;让玩家们可以更加畅快地玩耍。 植物大战僵尸杂交版V2.1 :苹果安卓 PC防闪退工具修改工具高清工具通关…

16个不为人知的资源网站,强烈建议收藏!

整理了16个不为人知的资源网站&#xff0c;涵盖了课程学习、办公技能、娱乐休闲、小说音乐等多种资源&#xff0c;强烈建议收藏&#xff01; #学习网站 1、中国大学MOOC icourse163.org/ 这是一个汇集了国内顶尖大学免费课程资源的平台&#xff0c;众多985工程院校如北京大…

将HTML转化为PDF,一键操作轻松实现高效文件转换,轻松应对多种需求场景

在信息时代的浪潮中&#xff0c;文件格式的转换已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是网页内容的保存、报告的整理还是简历的发送&#xff0c;我们经常需要将HTML文档转换为PDF格式&#xff0c;以确保文件内容的完整性和可读性。然而&#xff0c;传统的转…

rollup打包项目:rollup.config.js

rollup打包带vue文件的项目 import nodeResolve from rollup/plugin-node-resolve import babel from rollup/plugin-babel import commonjs from rollup/plugin-commonjs; import vuePlugin from rollup-plugin-vue; import typescript from rollup-plugin-typescript2; impo…

3dmax在设计3D模型时闪退解决方法---模大狮模型网

3ds Max 在设计 3D 模型时闪退可能由多种原因造成&#xff0c;以下是一些常见的解决方法&#xff1a; 更新显卡驱动程序&#xff1a; 一个过时或不稳定的显卡驱动程序可能导致 3ds Max 闪退。请确保你的显卡驱动程序是最新版本&#xff0c;并且与 3ds Max 兼容。 关闭不必要的…

基于MCGS的双容水箱液位控制系统设计【MCGS+MATLAB+研华工控机】

摘 要 液位控制技术在众多工业领域中扮演着至关重要的角色。无论是化工、制药、食品加工还是水处理行业&#xff0c;对液位进行精确控制都是保证生产流程稳定、产品质量可靠的关键环节。因此基于实验平台设计了液位自动控制系统。首先&#xff0c;根据实际液位的控制需求&…

【SpringCloud学习笔记】RabbitMQ(上)

1. RabbitMQ简介 官网地址&#xff1a;https://www.rabbitmq.com/ 2. 安装方式 安装前置准备&#xff1a; 此处基于Linux平台 Docker进行安装&#xff0c;前置准备如下&#xff1a; Linux云服务器 / 虚拟机Docker环境 安装命令&#xff1a; docker run \-e RABBITMQ_DEFAU…

大文件word生成的处理与解决策略

前言 对于简单word文档的生成导出&#xff0c;java已经有着很多技术来进行处理&#xff0c;在有着相对固定的格式样板下&#xff0c;采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后&#xff0c;采用模板导出就显得无力了&#xff0c;模板的缺点是无法应…

visdom使用时所遇的问题及解决方法

最近在用visdom进行可视化的过程中&#xff0c;虽然可有效的避免主机拒绝访问&#xff08;该问题的解决方法&#xff0c;请参考深度学习可视化工具visdom使用-CSDN博客&#xff09;即在终端输入python -m visom.server 1.训练过程中visdom出现ValueError: too many file descr…

C#知识|基于实体类对象,返回实体集合封装介绍。

哈喽,你好啊,我是雷工! 前面通过实体类封装传递了零散的参数,打包后给数据访问方法。 但当查询结果是数据集,要把查询到的数据返回给UI时,我们也可以把返回的多条零散数据封装到实体类中。 此次练习可以使用实体容器:泛型集合List<T>,当把每条数据封装成实体对…

pytorch中,load_state_dict和torch.load的区别?

在 PyTorch 中&#xff0c;load_state_dict 和 torch.load 是两个不同的函数&#xff0c;用于不同的目的。 torch.load: 用途: 从磁盘加载一个保存的对象。这个对象可以是一个模型的整个状态字典&#xff08;包含模型参数&#xff09;、优化器状态字典、甚至是任意其他 Python …

简约不简单,建筑装饰演绎现代美学

走在城市的大街小巷&#xff0c;你是否曾被那些独特而精美的建筑装饰所吸引&#xff1f;每一栋建筑都像是艺术家的杰作&#xff0c;通过精美的装饰诉说着它的故事。 我们的建筑装饰&#xff0c;不仅注重外在的美观&#xff0c;更追求内在的品质。从古典的雕花到现代的简约线条&…

Bash脚本:删除根目录内的所有node_modules文件夹

Bash脚本&#xff1a;删除根目录内的所有node_modules文件夹 常用脚本 #!/bin/bash # find . -name "node_modules" -type d -prune -print -exec rimraf {} \;# find . -name "node_modules" -type d -prune&#xff1a;使用 find 命令查找当前目录及其…