介绍
cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。
语法
格式:
[秒] [分] [小时] [日] [月] [周] [年]
| 位置 | 字段 | 允许值范围 | 特殊字符 | 说明 |
|---|---|---|---|---|
| 1 | 秒 | 0-59 | , - * / |
例如:0 表示整秒触发 |
| 2 | 分 | 0-59 | , - * / |
例如:30 表示 30 分触发 |
| 3 | 时 | 0-23 | , - * / |
例如:2 表示凌晨 2 点 |
| 4 | 日 | 1-31 | , - * / ? L W C |
注意:“日”和“周”通常不同时指定(用 ? 避免冲突) |
| 5 | 月 | 1-12 或 JAN-DEC | , - * / |
例如:1 或 JAN 表示 1 月 |
| 6 | 周 | 1-7 或 SUN-SAT(1=SUN) | , - * / ? L C # |
例如:1 或 SUN 表示周日 |
| 7 | 年(可选) | 1970-2099 | , - * / |
省略时表示每年 |
特殊字符含义
特殊字符用于灵活定义时间规则,核心用法如下:
| 字符 | 含义 | 示例 |
|---|---|---|
* |
匹配该字段的所有可能值(“每”) | 分钟字段为 * → 每分钟触发 |
? |
仅用于“日”和“周”,表示“不指定值”(避免两者冲突) | 日字段为 ? 且周字段为 1 → 每周日触发(不指定具体日期) |
- |
表示范围 | 小时字段 9-17 → 9 点到 17 点之间每小时触发 |
, |
表示多个值(列表) | 周字段 1,3 → 周日和周二触发(1=SUN,3=TUE) |
/ |
表示“间隔”(步长),格式:起始值/步长 |
秒字段 0/10 → 从 0 秒开始,每 10 秒触发一次(0,10,20,…50 秒) |
L |
仅用于“日”和“周”,表示“最后” | 日字段 L → 当月最后一天;周字段 L → 当月最后一个周日 |
W |
仅用于“日”,表示“最近的工作日”(周一到周五) | 日字段 15W → 15 日最近的工作日(若 15 日是周六,则 14 日周五触发) |
# |
仅用于“周”,格式:n#m 表示“第 m 个星期 n” |
周字段 3#2 → 当月第 2 个周二(3=TUE) |
注意:除了 {日期} 和 {星期} 可以使用 ? 来实现互斥,表达无意义的信息之外,其他占位符都要具有具体的时间含义,且依赖关系为:年->月->日期(星期)->小时->分钟->秒数
Quartz 与 Spring Boot 的差异
“年”字段
- Quartz 支持第 7 个字段(年),例如
0 0 0 1 1 ? 2024表示 2024 年 1 月 1 日执行。 - Spring Boot 的
@Scheduled注解不支持“年”字段(仅 6 个字段),若需限制年份,需在代码中判断。
“周”的编号
- 两者均支持
SUN-SAT(周日到周六),但数字编号中,Quartz 中1=SUN,而部分系统中0=SUN,建议用英文缩写(如SUN)避免混淆。
常用示例(Quartz + Spring Boot 通用)
1. 基础频率
0 0 2 * * ?→ 每天凌晨 2 点整执行0 30 10 * * ?→ 每天上午 10 点 30 分执行0 0/30 9-18 * * ?→ 每天 9 点到 18 点之间,每 30 分钟执行一次0 * 14 * * ?→ 每天 14 点到 15 点之间,每分钟执行一次(整分触发)
2. 每周/每月
0 0 12 ? * 1→ 每周日中午 12 点执行(1=SUN)0 0 10 ? * 3#2→ 每月第 2 个周二上午 10 点执行(3=TUE)0 0 23 L * ?→ 每月最后一天晚上 23 点执行
3. 特殊场景
0 0 1 1 * ?→ 每年 1 月 1 日凌晨 1 点执行(新年触发)0 0 8,12,18 * * ?→ 每天 8 点、12 点、18 点各执行一次0 15 10 ? * MON-FRI→ 每周一到周五上午 10 点 15 分执行
其他常用示例
0 0 12 * * ? 每天12点触发
0 15 10 ? * * 每天10点15分触发
0 15 10 * * ? 每天10点15分触发
0 15 10 * * ? * 每天10点15分触发
0 15 10 * * ? 2005 2005年每天10点15分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 15 * ? 每月15号上午10点15分触发
0 15 10 L * ? 每月最后一天的10点15分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)
生成器
https://www.bejson.com/othertools/cron/
参考:
https://blog.csdn.net/pan_junbiao/article/details/109399280
https://blog.csdn.net/m0_37179470/article/details/81271607