一、概述
当需要计划按照较为复杂的时间设定进行执行,且无法通过“新建计划”界面简单配置实现时,可以通过设置Cron表达式实现。
二、CRON表达式规则
1、基本结构
Cron表达式是一个字符串,由6或7个时间字段组成,各字段以空格分隔,格式如下:
示例格式:
- 0 0 8 * * ? → 每天8:00执行
- 0 0/5 14 * * ? → 每天14:00开始,每5分钟执行一次
2、字段含义与取值范围
字段 | 允许值 | 允许的特殊字符 | 备注 |
秒 | 0-59 | , - * / | 控制秒级触发 |
分 | 0-59 | , - * / | 控制分钟级触发 |
时 | 0-23 | , - * / | 控制小时级触发 |
日 | 1-31 | , - * ? / L W C | 1)控制每月具体某天。 2)需要注意一些特别的月份。 |
月 | 1-12 或 JAN-DEC | , - * / | 控制月份 |
周 | 1-7 或 SUN-SAT (1=周日) | , - * ? / L C # | 1)控制每周某天 2)有些系统可能:1=周一 |
年 (可选) | 1970-2099 | , - * / | 控制年份 |
3、特殊字符含义
字符 | 含义 |
---|---|
*(通配符) | 表示匹配该字段的所有值。例如:在"分"字段使用*表示每分钟。 |
?(不指定值) | 用于日和周的冲突解决(只能指定其中一个)。因为"日"和"周"会相互影响,所以其中一个指定值后,另一个必须用 ? 占位。比如,指定每月15号执行时,"周"字段就要用?;指定每周一执行时,"日"字段就要用?。例如: 0 0 12 15 * ? 表示每月15号12点执行;0 0 12 ? * MON 表示每周一12点执行。 |
/(间隔) | 定义步长。例如 0/15 * * * * ? 表示从第0秒开始,每15秒执行一次。 |
-(范围) | 指定连续时间范围。例如 0 0 9-17 * * ? 表示每天9点到17点每小时执行一次。 |
,(枚举) | 列举多个值。例如 0 0 1,13,18 * * ? 表示每天1点、13点、18点执行。 |
L(最后,Last) |
|
W(工作日,Weekday) | 在"日"字段中,表示离指定日期最近的工作日。例如 15W 若15号是周六,则触发14号(周五)。 |
#(第几周) | 星期字段中,表示某月第几个星期几。例如 6#3 表示每月的第三个星期五。 |
C(日历,Calendar) | 很少使用。 |
4、注意事项
1)日与星期字段
必须至少一个设为 ?,否则冲突。例如 0 0 12 1 * ? 表示每月1日中午12点,不指定星期。
2)星期字段的数值含义
Quartz中 1=周日,依此类推,7=周六,而部分系统可能 1=周一,需注意环境差异。
3)年字段
年字段是可选的,通常可以省略。范围1970-2099,通常用于特定年份的调度。
4)闰年与月末处理
例如 0 0 0 29 2 ? 仅在闰年2月29日触发。
5)表达式不区分大小写
"MON"与"mon"效果相同
三、常见示例
需求 | CRON表达式 |
---|---|
每天中午12点触发 | 0 0 12 * * ? |
每周一至周五上午9:30触发 | 0 30 9 ? * MON-FRI |
每月1号上午10:15触发 | 0 15 10 1 * ? |
每5分钟触发一次 | 0 0/5 * * * ? |
每天上午9点到下午5点,每隔半小时触发 | 0 0/30 9-17 * * ? |
每月最后一天晚上11点触发 | 0 0 23 L * ? |
每月的最后一个周五上午10:15触发 | 0 15 10 ? * 6L |
每年1月的第2个周日早上9点触发 | 0 0 9 ? 1 1#2 |
四、CORN表达式生成器
可以使用 Cron 在线生成器生成表达式。例如:https://calctools.online/zh/time/cron#quartz。