java时间解析生成定时Cron表达式工具类
Cron表达式工具类CronUtil
构建Cron表达式
/****方法摘要:构建Cron表达式*@param taskScheduleModel*@return String*/public static String createCronExpression(TaskScheduleModel taskScheduleModel){StringBuffer cronExp = new StringBuffer("");if(null == taskScheduleModel.getJobType()) {System.out.println("执行周期未配置" );//执行周期未配置}if (null != taskScheduleModel.getSecond()&& null != taskScheduleModel.getMinute()&& null != taskScheduleModel.getHour()) {//秒cronExp.append(taskScheduleModel.getSecond()).append(" ");//分cronExp.append(taskScheduleModel.getMinute()).append(" ");//小时cronExp.append(taskScheduleModel.getHour()).append(" ");//每天if(taskScheduleModel.getJobType().getValue() == 1){if(taskScheduleModel.getBeApart()!=null){cronExp.append("1");//日cronExp.append("/");cronExp.append(taskScheduleModel.getBeApart()+1);//月cronExp.append(" ");cronExp.append("* ");cronExp.append("? ");//周cronExp.append("*");}else {cronExp.append("* ");//日cronExp.append("* ");//月cronExp.append("?");//周}}//按每周else if(taskScheduleModel.getJobType().getValue() == 3){//一个月中第几天cronExp.append("? ");//月份cronExp.append("* ");//周Integer[] weeks = taskScheduleModel.getDayOfWeeks();for(int i = 0; i < weeks.length; i++){if(i == 0){cronExp.append(weeks[i]);} else{cronExp.append(",").append(weeks[i]);}}}//按每月else if(taskScheduleModel.getJobType().getValue() == 2){//一个月中的哪几天Integer[] days = taskScheduleModel.getDayOfMonths();for(int i = 0; i < days.length; i++){if(i == 0){if(days[i]==32){//本月最后一天String endMouthCron="0 0 0 L * ?";return endMouthCron;}else {cronExp.append(days[i]);}} else{cronExp.append(",").append(days[i]);}}//月份cronExp.append(" * ");//周cronExp.append("?");}//按每年else if(taskScheduleModel.getJobType().getValue()== 4){//一个年中的哪几天Integer[] days = taskScheduleModel.getDayOfMonths();if(ArrayUtil.isEmpty(days)){cronExp.append("*");}else{for(int i = 0; i < days.length; i++){if(i == 0){cronExp.append(days[i]);} else{cronExp.append(",").append(days[i]);}}}//月份Integer[] months = taskScheduleModel.getMonths();if (ArrayUtil.isEmpty(months)) {cronExp.append(" *");}else{for (int i = 0; i < months.length; i++){Integer month = months[i];if (month > 12){throw new RuntimeException("月份数据异常: "+ Arrays.toString(months));}if(i == 0){cronExp.append(" ").append(month);}else{cronExp.append(",").append(month);}}}cronExp.append(" ?");}else if(taskScheduleModel.getJobType().getValue() == 0){cronExp.append("* ");//日cronExp.append("* ");//月cronExp.append("?");//周}}else {System.out.println("时或分或秒参数未配置" );//时或分或秒参数未配置}return cronExp.toString();}
生成计划的详细描述
/****方法摘要:生成计划的详细描述*@param taskScheduleModel*@return String*/public static String createDescription(TaskScheduleModel taskScheduleModel){StringBuffer description = new StringBuffer("");//计划执行开始时间
// Date startTime = taskScheduleModel.getScheduleStartTime();if (null != taskScheduleModel.getSecond()&& null != taskScheduleModel.getMinute()&& null != taskScheduleModel.getHour()) {//按每天if(taskScheduleModel.getJobType().getValue() == 1){description.append("每天");description.append(taskScheduleModel.getHour()).append("时");description.append(taskScheduleModel.getMinute()).append("分");description.append(taskScheduleModel.getSecond()).append("秒");}//按每周else if(taskScheduleModel.getJobType().getValue() == 3){if(taskScheduleModel.getDayOfWeeks() != null && taskScheduleModel.getDayOfWeeks().length > 0) {String days = "";for(int i : taskScheduleModel.getDayOfWeeks()) {if(i==1){days += "周日";}else {i=i-1;days += "周" + i;}}description.append("每周的").append(days).append(" ");}if (null != taskScheduleModel.getSecond()&& null != taskScheduleModel.getMinute()&& null != taskScheduleModel.getHour()) {description.append(",");description.append(taskScheduleModel.getHour()).append("时");description.append(taskScheduleModel.getMinute()).append("分");description.append(taskScheduleModel.getSecond()).append("秒");}}//按每月else if(taskScheduleModel.getJobType().getValue() == 2){//选择月份if(taskScheduleModel.getDayOfMonths() != null && taskScheduleModel.getDayOfMonths().length > 0) {String days = "";for(int i : taskScheduleModel.getDayOfMonths()) {days += i + "号";}description.append("每月的").append(days).append(" ");}description.append(taskScheduleModel.getHour()).append("时");description.append(taskScheduleModel.getMinute()).append("分");description.append(taskScheduleModel.getSecond()).append("秒");}}return description.toString();}
构建Cron表达式
/*** @description: 构建Cron表达式* * @return String* @author panlupeng* */public static String createLoopCronExpression(int rate, int cycle) {String cron = "";switch (rate) {case 0:// 每cycle秒执行一次cron = "0/" + cycle + " * * * * ?";break;case 1:// 每cycle分钟执行一次cron = "0 0/" + cycle + " * * * ?";break;case 2:// 每cycle小时执行一次cron = "0 0 0/" + cycle + " * * ?";break;case 3:// 每cycle天的0点执行一次cron = "0 0 0 1/" + cycle + " * ?";break;case 4:// 每cycle月的1号0点执行一次cron = "0 0 0 1 1/" + cycle + " ? ";break;case 5:// 每天cycle点执行一次cron = "0 0 " + cycle+ " * * ?";break;default:// 默认每cycle秒执行一次cron = "0/1 * * * * ?";break;}return cron;}
枚举类
public enum JobEnum {EVERY("每天",0),DAY("日",1),MONTH("月",2),WEEK("周",3),YEAR("年",4),;JobEnum(String name,Integer value) {this.name = name;this.value = value;}private final String name;private final Integer value;public Integer getValue() {return value;}public String getName() {return name;}}
TaskScheduleModel
public class TaskScheduleModel {/*** 所选作业类型:* 0 ->每天每次* 1 -> 每天* 2 -> 每月* 3 -> 每周* 4 -> 年*/JobEnum jobType;/**一周的哪几天*/Integer[] dayOfWeeks;/**一个月的哪几天*/Integer[] dayOfMonths;/**秒 */Integer second;/**分 */Integer minute;/**时 */Integer hour;/*** 年*/Integer[] months;/*** 间隔*/Integer beApart;public Integer[] getMonths() {return months;}public void setMonths(Integer[] months) {this.months = months;}public Integer getBeApart() {return beApart;}public void setBeApart(Integer beApart) {this.beApart = beApart;}public JobEnum getJobType() {return jobType;}public void setJobType(JobEnum jobType) {this.jobType = jobType;}public Integer[] getDayOfWeeks() {return dayOfWeeks;}public void setDayOfWeeks(Integer[] dayOfWeeks) {this.dayOfWeeks = dayOfWeeks;}public Integer[] getDayOfMonths() {return dayOfMonths;}public void setDayOfMonths(Integer[] dayOfMonths) {this.dayOfMonths = dayOfMonths;}public Integer getSecond() {return second;}public void setSecond(Integer second) {this.second = second;}public Integer getMinute() {return minute;}public void setMinute(Integer minute) {this.minute = minute;}public Integer getHour() {return hour;}public void setHour(Integer hour) {this.hour = hour;}}
测试
public static void main(String[] args) {//执行时间:每天的17时40分00秒 startTaskScheduleModel taskScheduleModel = new TaskScheduleModel();taskScheduleModel.setJobType(JobEnum.DAY);//按每天Integer hour = 17; //时Integer minute = 40; //分Integer second = 00; //秒taskScheduleModel.setHour(hour);taskScheduleModel.setMinute(minute);taskScheduleModel.setSecond(second);//每隔几天执行taskScheduleModel.setBeApart(1);String cropExp = createCronExpression(taskScheduleModel);System.out.println(cropExp + ":" + createDescription(taskScheduleModel));//执行时间:每天的17时40分00秒 endtaskScheduleModel.setJobType(JobEnum.WEEK);//每周的哪几天执行Integer[] dayOfWeeks = new Integer[7];dayOfWeeks[0] = 1;//周日dayOfWeeks[1] = 2;//周1dayOfWeeks[2] = 3;//周2dayOfWeeks[3] = 4;//周3dayOfWeeks[4] = 5;//周4dayOfWeeks[5] = 6;//周5dayOfWeeks[6] = 7;//周6taskScheduleModel.setDayOfWeeks(dayOfWeeks);cropExp = createCronExpression(taskScheduleModel);System.out.println(cropExp + ":" + createDescription(taskScheduleModel));taskScheduleModel.setJobType(JobEnum.MONTH);//每月的哪几天执行Integer[] dayOfMonths = new Integer[3];dayOfMonths[0] = 1;dayOfMonths[1] = 21;dayOfMonths[2] = 13;taskScheduleModel.setDayOfMonths(dayOfMonths);cropExp = createCronExpression(taskScheduleModel);System.out.println(cropExp + ":" + createDescription(taskScheduleModel));taskScheduleModel.setJobType(JobEnum.EVERY);//每天的几点几分几秒开始cropExp = createCronExpression(taskScheduleModel);System.out.println(cropExp);}
0 40 17 1/2 * ? *:每天17时40分0秒
0 40 17 ? * 1,2,3,4,5,6,7:每周的周日周1周2周3周4周5周6 ,17时40分0秒
0 40 17 1,21,13 * ?:每月的1号21号13号 17时40分0秒
0 40 17 * * ?
第二种解析方式
/*** @author longwei* @Description 日期时间转Cron表达式* @date 2022/11/4 18:17*/
public class DateTimeToCronUtils {/*** 每年format格式*/public static final String YEAR = "ss mm HH dd MM ? yyyy";/*** 每周format格式*/public static final String MONDAY = "ss mm HH ? * 1";public static final String TUESDAY = "ss mm HH ? * 2";public static final String WEDNESDAY = "ss mm HH ? * 3";public static final String THURSDAY = "ss mm HH ? * 4";public static final String FRIDAY = "ss mm HH ? * 5";public static final String SATURDAY = "ss mm HH ? * 6";public static final String SUNDAY = "ss mm HH ? * 7";/*** 每天format格式*/public static final String EVERYDAY = "ss mm HH * * ?";/*** 间隔-每天format格式*/public static final String INTERVAL_DAY = "0 0 0 1/param * ? ";/*** 间隔-每小时format格式*/public static final String INTERVAL_HOUR = "0 0 0/param * * ?";/*** 间隔-每分钟format格式*/public static final String INTERVAL_MINUTE = "0 0/param * * * ? ";/*** LocalDateTime格式化为String** @param date LocalDateTime* @param dateFormat format格式* @return String* @author longwei*/public static String formatDateByPattern(LocalDateTime date, String dateFormat) {return DateUtil.format(date, dateFormat);}/*** date格式化为String** @param date date* @param dateFormat format格式* @return String* @author longwei*/public static String formatDateByPattern(Date date, String dateFormat) {SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);String formatTimeStr = null;if (date != null) {formatTimeStr = sdf.format(date);}return formatTimeStr;}/*** 时间转换Cron表达式** @param date date* @param dateFormat format格式* @return Cron表达式* @author longwei*/public static String getCron(Date date, String dateFormat) {return formatDateByPattern(date, dateFormat);}/*** 时间转换Cron表达式** @param date date* @param dateFormat format格式* @return Cron表达式* @author longwei*/public static String getCron(LocalDateTime date, String dateFormat) {return formatDateByPattern(date, dateFormat);}/*** 间隔天转换Cron表达式** @param param 天* @return Cron表达式* @author longwei*/public static String getIntervalDayCron(String param) {return INTERVAL_DAY.replace("param", param);}/*** 间隔小时转换Cron表达式** @param param 小时* @return Cron表达式* @author longwei*/public static String getIntervalHourCron(String param) {return INTERVAL_HOUR.replace("param", param);}/*** 间隔分钟转换Cron表达式** @param param 分钟* @return Cron表达式* @author longwei*/public static String getIntervalMinuteCron(String param) {return INTERVAL_MINUTE.replace("param", param);}public static void main(String[] args) {Date date = new Date();String cron = getCron(date, YEAR);System.out.println("date-每年执行一次" + cron);cron = getCron(date, MONDAY);System.out.println("date-每周一执行" + cron);cron = getCron(date, EVERYDAY);System.out.println("date-每天执行" + cron);System.out.println("------------------------------");LocalDateTime localDateTime = LocalDateTime.now();cron = getCron(localDateTime, YEAR);System.out.println("localDateTime-每年执行一次" + cron);cron = getCron(localDateTime, MONDAY);System.out.println("localDateTime-每周一执行" + cron);cron = getCron(localDateTime, EVERYDAY);System.out.println("localDateTime-每天执行" + cron);LocalDate localDate = LocalDate.now();LocalDateTime dateTime = localDate.atTime(13, 14);cron = getCron(dateTime, EVERYDAY);System.out.println("localDateTime-每天指定时间执行" + cron);cron = getIntervalDayCron("1");System.out.println("localDateTime-间隔1天执行" + cron);cron = getIntervalHourCron("2");System.out.println("localDateTime-间隔2小时执行" + cron);cron = getIntervalMinuteCron("5");System.out.println("localDateTime-间隔5分钟执行" + cron);}}

相关文章:
java时间解析生成定时Cron表达式工具类
Cron表达式工具类CronUtil 构建Cron表达式 /****方法摘要:构建Cron表达式*param taskScheduleModel*return String*/public static String createCronExpression(TaskScheduleModel taskScheduleModel){StringBuffer cronExp new StringBuffer("");if(…...
JavaEE 网络原理——TCP的工作机制(末篇 其余TCP特点)
文章目录 一、滑动窗口二、流量控制三、拥堵控制四、延时应答五、捎带应答六、面向字节流七、异常情况八、总结 其余相关文章: JavaEE 网络原理——TCP的工作机制(中篇 三次握手和四次挥手) 本篇文章衔接的是前面两篇文章的内容,在这里继续解释 TCP 的内…...
【软件测试】了解JUnit单元测试框架常用注解
目录 1、认识JUnit 2、Junit中常见的注解 1、Test 2、Disabled 3、BeforeAll和AfterAll 4、BeforeEach和AfterEach 5、 ParameterizedTest:参数化 6、order 3、断言 1、断言相等【Assertions.assertEquals(预期,比较值)】;相等测试通…...
【广州华锐互动】三维全景3D消防科普展馆
在我们的日常生活中,火灾安全是一个不容忽视的重要问题。然而,由于缺乏对火灾的了解和应对技巧,许多人在面对火灾时往往感到无助和恐慌。为了解决这个问题,广州华锐互动开发了三维全景3D消防科普展馆,它是一个以虚拟现…...
某大型车企:加强汽车应用安全防护,开创智能网联汽车新篇章
某车企是安徽省最大的整车制造企业,致力于为全球消费者带来高品质汽车产品和服务体验,是国内最早突破百万销量的汽车自主品牌。该车企利用数字技术推动供应链网络的新型互动,加快数字化转型,持续进行场景创新、生态创新…...
LLVM学习笔记(50)
4.1.4. DAG合并与合法化 来自SelectionDAGBuilder的SelectionDAG输出还不能进行指令选择,必须通过额外的转换——显示在上图。在指令选择前应用的遍序列如下: 匹配一组节点,在有利时使用更简单的构造来替换它们,DAG合并遍优化Se…...
rpc入门笔记0x01
syntax "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name 1; // name表示名称,编号是1 }生成python文件 安装grpcio和grpcio-tools库 pip install grpcio #安装grpc pip install grpcio-tools #安装grpc tools生成…...
web - Tomcat服务器
文章目录 目录 文章目录 前言 一 . CS和BS的异同 二 . 什么是Tomcat 二 . Tomcat安装 四 . Tomcat目录结构 bin目录: 用于存放二进制的可执行文件 config目录 server.xml:配置整个服务器信息。例如修改端口号。默认HTTP请求的端口号是:8080 lib目录 log…...
后端接口返回常见的状态码
2开头 (请求成功)表示成功处理了请求的状态代码 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 201 (已创建) 请求成功并且服务器创建了新的资源。 202 …...
50.MongoDB快速入门实战
MongoDB概念 MongoDB是一个文档数据库(以 JSON 为数据模型),由C语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。 原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务&#x…...
一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版
Guitar Pro 8 .1.1for Mac 中文破解版是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧,重现喜爱的歌曲或陪伴自己。可以帮助我们进行吉他的学习、绘谱与创作,它包含了几乎所有的吉他现有指法及音色,在做弹拨…...
图论基础和表示
一、概念及其介绍 图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge&a…...
STM32 音频ADC转wav格式
STM32 音频ADC DAC测试方法_stm32 adc 音频-CSDN博客 STM32--vs1053 WAV录音实现(保存在SD卡)_vs1053 多字节读取-CSDN博客 单片机内部AD实现录音wav文件_adc语音信号采样_天外飞仙CUG的博客-CSDN博客 PCM编码格式_pcm格式-CSDN博客 用ADC编码PCM数据…...
面试中经常问道的问题二
深入理解前端跨域方法和原理 前言 受浏览器同源策略的限制,本域的js不能操作其他域的页面对象(比如DOM)。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。所以我们要通过一些方法使本域的js能够操作其他域的页面对象或者使…...
SQL UPDATE 语句(更新表中的记录)
SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 还可以使用AND或OR运算符组合多个条件。 SQL UPDATE 语法 具有WHERE子句的UPDATE查询的基本语法如下所示: UPDATE table_name SET column1 value1, column2 value2, ... WHERE conditi…...
js节流和防抖
节流(throttle)和防抖(debounce)是为了解决函数频繁触发而引发性能问题的两种优化方法。 节流: 指定一个时间间隔,在时间间隔内只执行一次函数,即在一段时间内,多次触发函数只执行一…...
权限系统设计(转载)
1 为什么需要权限管理 2 权限模型 2.1 权限设计 2.2 为什么需要角色 2.3 权限模型的演进 2.4 用户划分 2.5 理想的RBAC模型 3 权限系统表设计 3.1 标准RBAC模型表设计 3.2 理想RBAC模型表设计 4 结语 1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们&a…...
【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)
文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…...
Dockerfile文件自动化生成R4L镜像
Dockerfile文件自动化生成R4L镜像的步骤 1、安装Docker:2、使用Dockerfile一键生成镜像:3、查看生成的Docker镜像:4、删除Docker镜像:5、生成Docker容器:6、查看容器7、删除容器 1、安装Docker: curl -fsS…...
基于SSM的居家养老系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
