Java构建cron表达式

article/2025/9/18 23:19:40

1、cron表达式详解

 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,    Cron有如下两种语法格式:
(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek

2、cron表达式结构

2.1 每隔字符含义

corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

2.2 各字段的含义

字段允许值允许的特殊字符
秒(Seconds)0~59的整数, - * /    四个字符
分(Minutes0~59的整数, - * /    四个字符
小时(Hours0~23的整数, - * /    四个字符
日期(DayofMonth1~31的整数(但是你需要考虑你月的天数),- * ? / L W C     八个字符
月份(Month1~12的整数或者 JAN-DEC, - * /    四个字符
星期(DayofWeek1~7的整数或者 SUN-SAT (1=SUN), - * ? / L C #     八个字符
年(可选,留空)(Year1970~2099, - * /    四个字符

3、注意事项

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:

(1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 (4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次. (5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。 (6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。 (7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 (9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

4、常用表达式例子
cron在线生成和例子icon-default.png?t=M276https://www.bejson.com/othertools/cron/

(1)0 0 2 1 * ? *   表示在每月的1日的凌晨2点调整任务(2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业(3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作(4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 (5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 (6)0 0 12 ? * WED    表示每个星期三中午12点 (7)0 0 12 * * ?   每天中午12点触发 (8)0 15 10 ? * *    每天上午10:15触发 (9)0 15 10 * * ?     每天上午10:15触发 (10)0 15 10 * * ? *    每天上午10:15触发 (11)0 15 10 * * ? 2005    2005年的每天上午10:15触发 (12)0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发 (13)0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发 (14)0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 (15)0 0-5 14 * * ?    在每天下午2点到下午2:05期间的每1分钟触发 (16)0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发 (17)0 15 10 ? * MON-FRI    周一至周五的上午10:15触发 (18)0 15 10 15 * ?    每月15日上午10:15触发 (19)0 15 10 L * ?    每月最后一日的上午10:15触发 (20)0 15 10 ? * 6L    每月的最后一个星期五上午10:15触发 (21)0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发 (22)0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发

5、cron生成代码

5.1 cron表达式生成工具类

package com.shucha.digitalportalbackstage.biz.utils;import com.shucha.digitalportalbackstage.biz.model.TaskScheduleModel;/*** @author tqf* @Description* @Version 1.0* @since 2022-03-14 11:07*/
public class CronUtils {/****方法摘要:构建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()){//每隔几秒if (taskScheduleModel.getJobType().intValue() == 0) {cronExp.append("0/").append(taskScheduleModel.getSecond());cronExp.append(" ");cronExp.append("* ");cronExp.append("* ");cronExp.append("* ");cronExp.append("* ");cronExp.append("?");}}if (null != taskScheduleModel.getSecond()&& null != taskScheduleModel.getMinute()&& null == taskScheduleModel.getHour()){//每隔几分钟if (taskScheduleModel.getJobType().intValue() == 4) {cronExp.append("* ");cronExp.append("0/").append(taskScheduleModel.getMinute());cronExp.append(" ");cronExp.append("* ");cronExp.append("* ");cronExp.append("* ");cronExp.append("?");}}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().intValue() == 1){cronExp.append("* ");//日cronExp.append("* ");//月cronExp.append("?");//周}//按每周else if(taskScheduleModel.getJobType().intValue() == 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().intValue() == 2){//一个月中的哪几天Integer[] days = taskScheduleModel.getDayOfMonths();for(int i = 0; i < days.length; i++){if(i == 0){cronExp.append(days[i]);} else{cronExp.append(",").append(days[i]);}}//月份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().intValue() == 1){description.append("每天");description.append(taskScheduleModel.getHour()).append("时");description.append(taskScheduleModel.getMinute()).append("分");description.append(taskScheduleModel.getSecond()).append("秒");description.append("执行");}//按每周else if(taskScheduleModel.getJobType().intValue() == 3){if(taskScheduleModel.getDayOfWeeks() != null && taskScheduleModel.getDayOfWeeks().length > 0) {String days = "";for(int i : taskScheduleModel.getDayOfWeeks()) {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("秒");}description.append("执行");}//按每月else if(taskScheduleModel.getJobType().intValue() == 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("秒");description.append("执行");}}return description.toString();}//参考例子public static void main(String[] args) {// 每月的1号2号 10时12分0秒执行Integer[] dayOfMonths = new Integer[2];dayOfMonths[0] = 1;dayOfMonths[1] = 2;TaskScheduleModel taskScheduleModel = new TaskScheduleModel();taskScheduleModel.setJobType(2).setSecond(0).setDayOfMonths(dayOfMonths).setHour(10).setMinute(12);String cropExp = createCronExpression(taskScheduleModel);System.out.println(cropExp + ":" + createDescription(taskScheduleModel));// 每周的周1周2周3 10时12分0秒执行TaskScheduleModel weekModel = new TaskScheduleModel();Integer[] dayOfWeeks = new Integer[3];dayOfWeeks[0] = 1;dayOfWeeks[1] = 2;dayOfWeeks[2] = 3;weekModel.setJobType(3).setSecond(0).setDayOfWeeks(dayOfWeeks).setHour(10).setMinute(12);cropExp = createCronExpression(weekModel);System.out.println(cropExp + ":" + createDescription(weekModel));// 每天10时12分0秒执行TaskScheduleModel dayModel = new TaskScheduleModel();Integer[] dayOfMonths1 = new Integer[2];dayOfMonths1[0] = 1;dayOfMonths1[1] = 2;dayModel.setJobType(1).setSecond(0).setDayOfMonths(dayOfMonths1).setHour(10).setMinute(12);cropExp = createCronExpression(dayModel);System.out.println(cropExp + ":" + createDescription(dayModel));}
}

 5.2corn表达生成实体类

package com.shucha.digitalportalbackstage.biz.model;import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/*** @author tqf* @Description* @Version 1.0* @since 2022-03-14 11:09*/
@Data
@ApiModel(description = "cron表达体")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class TaskScheduleModel extends Model<TaskScheduleModel> {/*** 所选作业类型:* 1  -> 每天* 2  -> 每月* 3  -> 每周*/@ApiModelProperty(value = "所选作业类型(1-每天,2-每月,3-每周)")Integer jobType;/**一周的哪几天*/@ApiModelProperty(value = "一周的哪几天")Integer[] dayOfWeeks;/**一个月的哪几天*/@ApiModelProperty(value = "一个月的哪几天")Integer[] dayOfMonths;/**秒  */@ApiModelProperty(value = "秒")Integer second;/**分  */@ApiModelProperty(value = "分")Integer minute;/**时  */@ApiModelProperty(value = "时")Integer hour;}


http://chatgpt.dhexx.cn/article/w8XPM0GG.shtml

相关文章

Java解析cron表达式

概述 Cron表达式是一个字符串&#xff0c;以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&#xff0c;即两种语法格式&#xff1a; Seconds Minutes Hours DayofMonth Month DayofWeek Year&#xff0c;即&#xff1a;秒 分 时 天 月 星期 年份S…

Cron表达式详细用法

目录 Cron表达式一、秒二、分钟三、小时四、日期五、月份六、星期七、年份八、特殊字符九、表达式举例 Cron表达式 Cron表达式的长度为6或7位&#xff0c;其中第7位年份可省略&#xff0c;省略时表示每年。 Scheduled(cron"* * * * * * *") 这7位从左到右分别对应&…

一看就懂:cron 表达式

【前言】 不知道你在玩游戏的时候是否发现过以下情况&#xff1a; &#xff08;1&#xff09;玩某些游戏的时候&#xff0c;发现他的排行榜并不是时时更新的&#xff0c;而是每半个小时&#xff0c;或者一个小时更新一次。 &#xff08;2&#xff09;又比如很火的王者荣耀手…

cron表达式的详细介绍(各域说明以及举例说明)

cron表达式的详细介绍&#xff08;各域说明以及举例说明&#xff09; 1. 关于 cron1.1 前言1.2 使用 cron 的注意点1.3 举个例子 2. cron表达式的格式&#xff08;或语法&#xff09;3. 各域的含义——如何取值&#xff1f;3.1 各域的含义介绍3.2 特殊字符的含义3.3 简单举例说…

使用cron定时执行任务

本文主要介绍Unix系统中用于定时执行任务的cron守护程序和crontab配置表的文件格式&#xff0c;并对自动执行脚本文件时的注意事项进行了说明&#xff0c;主要包括以下几个方面&#xff1a; cron守护程序概述crontab配置表crontab配置举例执行命令脚本 cron是一个用于执行计划…

cron计划任务

这里写目录标题 总结一、cron(crond)简介二、crontab命令1&#xff0e;命令格式&#xff1a;2&#xff0e;命令功能&#xff1a;3&#xff0e;命令参数&#xff1a;第一种形式&#xff08;将原先存在的文件加入到corn中&#xff09;第二种形式&#xff08;用命令行的形式加入到…

Cron表达式

Cron表达式语法 一、结构 corn从左到右&#xff08;用空格隔开&#xff09;&#xff1a;秒 分 小时 日 月 星期 年 二、各字段的含义 &#xff08;1&#xff09;*&#xff1a;表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。 &#xff08;2&#x…

C语言结构体内存对齐

结构体内存对齐 如何计算结构体的大小&#xff1f; 首先得掌握结构体的对齐规则: 1.第一个成员在与结构体变量偏移量为0的地址处。(将第一个成员放在结构体内存的第0处) 2.其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。&#xff08;从0地…

C语言结构体对齐详解

文章目录 一、C语言结构体对齐大小快速判断二、反汇编角度看结构体三、总结 一、C语言结构体对齐大小快速判断 在C语言中定义一个结构体&#xff0c;里面具体占用多少个字节呢&#xff0c;先举一个例子&#xff0c;如下&#xff1a; #include<stdio.h> #pragma pack(8)…

C语言结构体传参

目录 C语言结构体传参1. 普通传参1.1 测试代码1.2 测试结果1.3 结果分析 2. 单指针传参2.1 修改结构体数据2.1.1 测试代码2.1.2 测试结果2.1.3 结果分析 2.2 修改结构体地址2.2.1 测试代码2.2.2 测试结果2.2.3 结果分析 3. 双指针传参3.1 测试代码3.2 测试结果3.2 结果分析 C语…

C语言 结构体

1什么是结构体 结构体是一种集合&#xff0c;它里面包含了多个变量或数组&#xff0c;它们的类型可以相同&#xff0c;也可以不同&#xff0c;每个这样的变量或数组都称为结构体的成员。结构的成员可以是标量、数组、指针&#xff0c;甚至是其他结构体。 2结构体的定义 (1&a…

c语言:结构体(详解)

初识结构体 一.结构体声明1.结构体的概念2.声明 二.结构体的基础使用三.结构体变量的定义和初始化四.空结构体五.柔性数组1.定义2.使用 六.结构体内存对齐七.位端 一.结构体声明 1.结构体的概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同…

C语言结构体详解

目录 一、结构体的基本概念 举个例子 二、结构体变量 三、结构体占用的内存情况 举个例子 运行效果 再次运行 四、结构体的变量名 五、结构体初始化 五、结构体初始化 举个例子 运行效果 六、结构体成员的访问 举个例子 运行效果 八、结构体指针 举个例子 运行效…

C语言结构体超详解(小白一看就懂,多维度分析!!!!)

目录 一、前言 二、结构体详解 &#x1f350;什么是结构体 &#x1f34e;结构体的定义与基础结构 &#x1f351;结构体的使用 &#x1f4a6;结构体的初始化 &#x1f4a6;结构体的成员访问 &#x1f4a6;结构体数组 &#x1f4a6;结构体指针--------------指向结构体变…

C语言之结构体(进阶篇)

目录 1.结构体的内存对齐​ 如何计算呢&#xff1f;​ 掌握结构体的对齐规则&#xff1a; 为什么存在内存对齐呢&#xff1f;​ ​​​​​​​offsetof​ 位段​ 什么是位段&#xff1f;​ 比如&#xff1a; 位段的内存分配​ 举个例子 位段的跨平台问题&#xff1a;​ 枚举…

C语言——结构体(全)

目录 一、结构体的设计 二、结构体变量的初始化 2.1结构体在内存表示&#xff1b; 2.2结构体初始化&#xff1b; 2.3结构体指针变量 2.4结构体嵌套结构体 三、结构体成员访问 3.1、结构体成员访问 3.2、结构体变量和指针 ​3.3、结构体和函数 四、结构体与数组 五、…

Github客户端下载慢的解决方法

Github客户端下载慢的解决方法 Github客户端下载解决方法获取下载连接 Github客户端下载 Github客户端的下载地址是——Github客户端下载。 但是下载速度特别慢&#xff0c;最快也就十几K。 解决方法 使用迅雷下载&#xff1a;将Github客户端的下载地址复制到迅雷中&#…

windows平台下使用Github(2 创建代码仓库,安装Github客户端.)

本文会分章节的来介绍如何在windows平台下使用GitHub 一、注册Github账号 查看 二、创建代码仓库&#xff0c;安装Github客户端.查看 三、Github上传和下载(1 客户端方式)查看 四、Github上传和下载(2 命令行方式)查看 1、创建一个代码托管仓库。 点击右上角的 号或者点…

github客户端进行token认证

从 2021 年 8 月 13 日起&#xff0c;GitHub 在对 Git 操作进行身份验证时不再接受帐户密码。您需要添加 PAT&#xff08;个人访问令牌&#xff09;&#xff0c;您可以按照以下方法在您的系统上添加 PAT。 git - Support for password authentication was removed. Please us…

【解决】GitHub 客户端下载后安装在哪里?

GitHub Desktop 配置环境变量GitHub 安装路径GitHub Shell、Bash 环境是 Windows 10。 从 GitHub 官网下载了 GitHub 的 Desktop 版本之后&#xff0c;它其实不仅是一个 GUI&#xff0c;还带了 Shell&#xff08;Bash&#xff09;&#xff0c;但是发现找不到它们是被安装在哪个…