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月的10点执行一次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 * ? *:每天174000 40 17 ? * 1,2,3,4,5,6,7:每周的周日周123456 ,174000 40 17 1,21,13 * ?:每月的12113174000 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);}}

在这里插入图片描述

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

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

相关文章

openlayers 地图组件封装

openlayers 地图组件封装 <template><div class"mapBox"><!-- 地图 --><div ref"map" id"map" class"map"></div><!-- 点位弹窗 --><div id"popup" class"ol-popup">…

React中如何提高组件的渲染效率

一、是什么 react 基于虚拟 DOM 和高效 Diff算法的完美配合&#xff0c;实现了对 DOM最小粒度的更新&#xff0c;大多数情况下&#xff0c;React对 DOM的渲染效率足以我们的业务日常 复杂业务场景下&#xff0c;性能问题依然会困扰我们。此时需要采取一些措施来提升运行性能&…

k8s-----26、细粒度权限管理 RBAC

0、导读 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限(也就是通过serviceaccount) token(共享秘钥) SSL(双向SSL认证) …通过任何一个认证即表示认证通过,进入下一步第二步:授权检查,确认是否对资源…

JAVAEE初阶相关内容第十六弹--网络编程

写在前 这一节的内容首先是对十五弹&#xff08;UDP回显服务器&#xff09;进行简单的改进&#xff0c;在这基础上开始介绍TCP流套接字编程。 目录 写在前 1.改进回显服务器 1.1完整代码实现 1.2运行输出结果 2.TCP流套接字编程 2.1ServerSocketAPI 2.2SocketAPI 3.TC…

echarts的柱状图的重叠和堆叠实现两个柱体的显示和之前的差值显示

效果图 主要思路 准备三个柱体&#xff08;原计划&#xff0c;实际进度&#xff0c;差值&#xff09; 原计划和实际进度设置成重叠 {barWidth: 20,// yAxisIndex: 1,z: 1,name: 原计划,type: bar,stack: ab,emphasis: { // 点击柱体其他柱体颜色会变浅disabled: true},label…

Docker Nginx安装使用以及踩坑点总结

Docker Nginx安装使用以及踩坑点总结 拉取nginx镜像 docker pull nginx:latest运行镜像 暂时不需要配置volume挂载 docker run --name nginx -p 80:80 -d nginx参数详解&#xff1a; --name nginx 指定容器的名称 -p 80:80 映射端口 -d 守护进程运行 创建volume目录 mk…

代码随想录打卡第五十天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 …

APA——概述

目录 一、前言 二、AVM概述 三、APA概述 一、前言 AVM:Around View Monitor 全景环视系统,也叫360影像,低速摄像头ADAS,目前已经比较成熟,在很多OEM设计车型中已成为一种标配的泊车驾驶辅助功能。使用前后左右四摄像头传感器,包括联合标定、视图切换、视图投影、图像拼…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):一个AWTK工程

一个AWTK工程基于C/C++编写,可以分为如下几步: 结合下图,看懂启动的部分。一般一个AWTK工程,需要实现哪些部分,就是其中开始之后白色的部分,比如调用main函数和gui_app_start时会做一些操作,比如asset_init和application_init时要做一些设置,还有退出的函数application…

【ARM AMBA Q_Channel 详细介绍】

文章目录 1.1 Q_Channel 概述1.2 Q-Channel1.2.1 Q-Channel 接口1.2.2 Q-Channel 接口的握手状态1.2.3 握手信号规则 1.3 P_Channel的握手协议1.3.1 device 接受 PMU 的 power 请求1.3.2 device 拒绝 PMU 的 power 请求 1.4 device 复位信号与 Q _Channel 的结合1.4.1 RESETn 复…

Xcode iOS app启用文件共享

在info.plist中添加如下两个配置 Supports opening documents in place Application supports iTunes file sharing 结果都为YES&#xff0c;如下图所示&#xff1a; 然后&#xff0c;iOS设备查看&#xff0c;文件->我的iPhone列表中有一个和你工程名相同的文件夹出现&…

C#演示单例模式

单例模式的特点&#xff1a; 确保一个类只有一个实例,并提供一个全局访问点。 //单例模式的实现internal class Boss{//定义静态变量保存实例private static Boss uniqueBoss;//定义锁&#xff0c;确保线程访问安全private static readonly object _lock new object();//定义私…

linux查看内存的方式

1、显示内存状态:free -h  以合适的单位显示内存使用情况&#xff0c;最大为三位数&#xff0c;自动计算对应的单位值。单位有&#xff1a; B bytes K kilos M megas G gigas T teras $free -htotal used free shared buff/cache available Me…

工作小计-GPU硬编以及依赖库 nvcuvidnvidia-encode

工作小计-GPU编码以及依赖库 已经是第三篇关于编解码的记录了。项目中用到GPU编码很久了&#xff0c;因为yuv太大&#xff0c;所以编码显得很重要。这次遇到的问题是环境的搭建问题。需要把开发机上的环境放到docker中&#xff0c;以保证docker中同样可以进行GPU的编码。 1 定…

安装pandas报错

报错信息&#xff1a; C:\Users\Jordan>pip install pandas Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/ Collecting pandasUsing cached https://pypi.tuna.tsinghua.edu.cn/packages/3a/6e/6c9c197ec2da861ea8c9c6848f0f887b7563f16e607bc6a35506af6…

JKPacket权威指南——联系我们

各位在使用JKPacket的过程中遇到问题或者阅读本书发现有错误之处可以通过下方邮箱联系到我。 邮箱&#xff1a;zhangsande18163.com

三代自动驾驶系统及主流科技公司自动驾驶技术方案简介

截止目前&#xff0c;按技术特点&#xff0c;自动驾驶技术大致经历了三代发展&#xff1a;第一代自动驾驶技术以后融合感知技术&#xff0c;高精度地图&#xff0c;基于惯导、GPS定位系统&#xff0c;预测模块&#xff0c;基于优化、搜索的规控等组成。第一代比较成熟的自动驾驶…

是顺流还是逆流?未来物流作业是否将被机器人全面取代?

原创 | 文 BFT机器人 随着人工智能的加速发展&#xff0c;各行业为适应数字时代的潮流&#xff0c;纷纷引入智能制造&#xff0c;帮助企业实现产业升级。而物流行业也不例外&#xff0c;现今人们的生活速度加快&#xff0c;为了快捷便利&#xff0c;很多的人喜欢通过网购、快递…

JavaScript基础知识18——逻辑运算符之短路运算

哈喽&#xff0c;大家好&#xff0c;我是雷工。 本节学习JavaScript基础知识——逻辑运算符中的短路运算&#xff0c;以下为学习笔记。 规则&#xff1a; 1、如果是&&运算&#xff0c;只要遇到false&#xff0c;就立即短路&#xff0c;不会再执行了&#xff0c;直接返回…

Linux学习第24天:Linux 阻塞和非阻塞 IO 实验(一): 挂起

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开始今天的笔记之前谈一下工作中遇见的一个问题。 本篇笔记主要学习Linux 阻塞和非阻塞 IO 实验&#xff0c;主要包括阻塞和非阻塞简介、等待队列、轮询、…