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 * * ?相关文章:
java解析生成定时Cron表达式工具类
Cron表达式工具类CronUtil 构建Cron表达式 /****方法摘要:构建Cron表达式*param taskScheduleModel*return String*/public static String createCronExpression(TaskScheduleModel taskScheduleModel){StringBuffer cronExp new StringBuffer("");if(…...
庆祝1024
在CSDN1024这一天,我不禁回想起自己这几年来在这个平台上的经历。回忆着初来时的稚嫩,如今的迷茫与期待,我深深地感受到自己还需不断努力。 回想起八年前,我刚刚步入计算机科学与技术的领域,满怀激情地加入了CSDN这个高…...
时间格式记录
ISO 8601:这是一种国际标准的日期和时间表示方式,格式为YYYY-MM-DDTHH:mm:ss.sssZ,其中 YYYY 代表四位数年份,MM 代表月份,DD 代表天数,T 作为日期和时间的分隔符,HH 代表小时,mm 代…...
hive插入动态分区数据时,return code 2报错解决
目录 一、完整报错 二、原因 三、其他 一、完整报错 Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 二、原因 大概率是因为没有开启允许动态分区或单次动态分区个数太小了。 -- 动态分区前…...
解决报错:gnutls_handshake() failed: The TLS connection was non-properly terminated.
执行git clone的时候,出现错误:gnutls_handshake() failed: The TLS connection was non-properly terminated. 如图: 解决方式: 两次重置代理:完美解决 git config --global --unset https.https://github.com.pro…...
《 汇编语言的系统学习》一、编程语言、机器语言与汇编语言
目录 《 汇编语言的系统学习》1、编程语言1.1 语言1.2 程序 2 编程语言分类2.1 机器语言2.2 汇编语言2.3 高级程序语言2.3.1 编译型2.3.1 解释型 《 汇编语言的系统学习》 1、编程语言 1.1 语言 定义:一种系统的,人与人之间通过声音、符号等进行交流的…...
【RocketMQ系列十四】RocketMQ中消息堆积如何处理
您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精…...
Ubuntu - sudo apt update 报错源问题解决方案
sudo apt update 报错…lease’ does not have a Release file. 反正就是觉得是网络的问题 尝试添加国内清华源、阿里源 不行 尝试DNS 为8.8.8.8,114.114.114.114 还是不行 解决方案:设置里面让 Ubuntu 找到适合自己的源 1、Settings -> About…...
MSQL系列(八) Mysql实战-SQL存储引擎
Mysql实战-SQL存储引擎 前面我们讲解了索引的存储结构,BTree的索引结构,我们一般都知道Mysql的存储引擎有两种,MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎 文章目录 Mysql实战-SQL存储引擎1.存储引擎2.MyISAM的特点3. InnoDB的特…...
vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
文章目录 ⭐前言💖 技术栈选择 ⭐前端页面搭建💖 调整请求content-type传递formData ⭐后端接口实现💖 swagger文档测试接口 ⭐前后端实现效果💖 上传单个文件💖 上传目录文件 ⭐总结⭐结束 ⭐前言 大家好,…...
html 常见兼容性问题
目录 前言: 用法: 代码: 1. 盒模型差异: 2. 表格布局问题: 3. 浏览器前缀问题: 4. 字体渲染问题: 理解: 讨论: 前言: 在Web开发中,兼容性问题是常见的挑战之一。不同的浏览器和设备可能以不同的方式解释和呈现HTML,导致网页在某些环境下出现问题…...
PCL 点云投影到圆柱(C++详细过程版)
目录 一、算法原理1、圆柱方程2、投影原理二、代码实现三、结果展示1、原始点云2、投影结果四、参考链接一、算法原理 1、圆柱方程 圆柱方程可以表示为: ( x − x...
以太网链路聚合与交换机堆叠,集群
目录 以太网链路聚合 一.链路聚合的基本概念 二.链路聚合的配置 1.手工模式 2.LACP模式 系统优先级 接口优先级 最大活动接口数 活动链路选举 负载分担 负载分担模式 三.典型使用场景 交换机之间 交换机和服务器之间 交换机和堆叠系统 防火墙双机热备心跳线 四…...
5G RedCap工业智能网关
5G RedCap工业智能网关是当前工业智能化发展领域的重要技术之一。随着物联网和工业互联网的迅速发展,企业对于实时数据传输和高速通信需求越来越迫切。在这种背景下,5G RedCap工业智能网关以其卓越的性能和功能,成为众多企业的首选。 5G RedC…...
STM32-ADC实验
AD转换包括采样阶段和转换阶段。在采样阶段才对通道数据进行;在转换阶段只是将采集的数据进行转换为数字量输出,此刻通道数据变化不会改变转换结果。 实验1:单ADC单通道中断 硬件原理图 由于PC1接到电位器上,所以我们实验选择PC1…...
05、Python -- 爬取ts文件格式视频思路
目录 第一步:爬取一段5秒视频找url代码结果 第二步:下载整个视频的所有片段代码:结果: 第三步:合成视频安装模块代码:结果 简洁代码代码:结果: 最终代码简洁前代码简洁后代码 思路&a…...
【QT】其他常用控件2
新建项目 lineEdit 什么都不显示(linux password) password textEdit和plainTextEdit spinBox和doubleSpinBox timeEdit、dateEdit、dateTimeEdit label 显示图案,导入资源:【QT】资源文件导入_复制其他项目中的文件到qt项目中_St…...
django报错--Not Found The requested URL was not found on the server.
这个问题通常是由于服务器配置或代码错误导致的。以下是解决这个问题的一些建议和步骤: 首先,请确保你的URL拼写正确。确认URL中的路径和文件名都是正确的,并且没有任何拼写错误。如果你是从浏览器中复制粘贴URL,请确保没有任何额…...
VLOOKUP函数的使用方法
VLOOKUP是一个查找函数,给定一个查找的目标,它就能从指定的查找区域中查找返回想要查找到的值。它的基本语法为: VLOOKUP(查找目标,查找范围,返回值的列数,精确OR模糊查找)下面以一个实例来介绍…...
关于前端如何下载后端接口返回content-type为application/octet-stream的文件
关于前端如何下载后端接口返回response-type为application/octet-stream的文件 问题描述 后端接口定义为直接返回一个文件,如果带认证信息可以直接通过浏览器url下载,但是接口需要传headers认证信息,url上又不支持传相关信息 解决 前端…...
Massa区块链终极资源指南:开发者、节点运营者与用户的完整工具清单
Massa区块链终极资源指南:开发者、节点运营者与用户的完整工具清单 【免费下载链接】massa The Decentralized and Scaled Blockchain 项目地址: https://gitcode.com/gh_mirrors/ma/massa Massa是一个去中心化且可扩展的区块链平台,为开发者、节…...
网传OpenAI“股权结构表”:微软“130亿美元投资”已升至“2283亿美元”-周红伟
一份疑似泄露的OpenAI股权结构表,将这家AI公司内部的利益分配格局首次摆在了公众面前。近日,一份据称来自OpenAI的股权结构表(cap table)在网络上广泛流传。据Celebrity Net Worth网站4月3日报道,该文件与OpenAI本轮融…...
PE结构 --->8.PE对齐的概念 文件对齐VS磁盘对齐
目录 PE结构中对齐概念详解 原理 磁盘文件对齐(File Alignment, 0x200): 内存对齐(Section Alignment, 0x1000): 关系与CPU页管理: 详细步骤:PE文件加载到内存的对齐过程 读取…...
零root权限+40%成本下降!OpenClaw Podman容器化部署全攻略,AWS Graviton+ECR打造AI Agent生产环境
本文已收录于《OpenClaw 实战指南》专栏,所有方案均经过AWS生产环境反复验证,覆盖从环境初始化到高可用集群部署全流程,附可直接复制的标准化部署脚本、Dockerfile模板、IAM权限配置与高频踩坑解决方案,适合AI Agent开发者、DevOp…...
PINN在流体力学中的应用:Burger方程参数反演全流程解析
PINN在流体力学中的革命性实践:Burger方程参数反演深度指南 当计算流体力学遇上深度学习,一场静悄悄的革命正在发生。传统数值方法在求解复杂流体问题时往往面临计算成本高、适应性差的瓶颈,而物理信息神经网络(PINN)的…...
幻兽帕鲁存档修复终极指南:告别数据丢失的完整解决方案
幻兽帕鲁存档修复终极指南:告别数据丢失的完整解决方案 【免费下载链接】palworld-host-save-fix Fixes the bug which forces a player to create a new character when they already have a save. Useful for migrating maps from co-op to dedicated servers and…...
3步掌握OCAT:OpenCore配置效率提升300%的GUI管理方案
3步掌握OCAT:OpenCore配置效率提升300%的GUI管理方案 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools OCAuxiliaryTools&…...
3个实用技巧让Notepad--始终保持高效运行
3个实用技巧让Notepad--始终保持高效运行 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 如何判断你的编辑器需要性能优…...
GHelper:华硕笔记本性能优化与硬件控制的开源解决方案
GHelper:华硕笔记本性能优化与硬件控制的开源解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…...
终极指南:activate-linux项目如何实现WebAssembly移植与浏览器环境运行
终极指南:activate-linux项目如何实现WebAssembly移植与浏览器环境运行 【免费下载链接】activate-linux The "Activate Windows" watermark ported to Linux 项目地址: https://gitcode.com/gh_mirrors/ac/activate-linux activate-linux是一个有…...
