当前位置: 首页 > news >正文

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 * * ?
http://www.lryc.cn/news/205083.html

相关文章:

  • 庆祝1024
  • 时间格式记录
  • hive插入动态分区数据时,return code 2报错解决
  • 解决报错:gnutls_handshake() failed: The TLS connection was non-properly terminated.
  • 《 汇编语言的系统学习》一、编程语言、机器语言与汇编语言
  • 【RocketMQ系列十四】RocketMQ中消息堆积如何处理
  • Ubuntu - sudo apt update 报错源问题解决方案
  • MSQL系列(八) Mysql实战-SQL存储引擎
  • vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
  • html 常见兼容性问题
  • PCL 点云投影到圆柱(C++详细过程版)
  • 以太网链路聚合与交换机堆叠,集群
  • 5G RedCap工业智能网关
  • STM32-ADC实验
  • 05、Python -- 爬取ts文件格式视频思路
  • 【QT】其他常用控件2
  • django报错--Not Found The requested URL was not found on the server.
  • VLOOKUP函数的使用方法
  • 关于前端如何下载后端接口返回content-type为application/octet-stream的文件
  • 报错:SSL routines:ssl3_get_record:wrong version number
  • Flask后端开发(一)-基础知识和前期准备
  • 基于SSM的幼儿园管理系统
  • 互联网Java工程师面试题·Spring篇·第三弹
  • 前端(二十三)——轮询和长轮询
  • uniapp把文件中的内复制到另一个文件中
  • 什么是蓝桥杯?什么是蓝桥STEMA考试?
  • 快递排序Java
  • Spark简单回顾
  • DDD与微服务的千丝万缕
  • S32K324 UDS Bootloader开发-需求篇