CRON 表达式
CRON 表达式是一种用于定义定时任务的格式,通常用于 Unix 和类 Unix 系统中的 cron 调度程序。CRON 表达式由 5 个到 7 个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年份(年份为可选字段)。每个字段使用空格分隔。每个字段代表一个时间单位,包括秒、分钟、小时、日期、月份、星期和年(可选)。以下是 CRON 表达式的一般格式:
plain
秒 分钟 小时 日期 月份 星期 年(可选)CRON 表达式字段
- 秒 (Seconds):0-59(可选字段,通常在许多实现中省略)
- 分钟 (Minutes):0-59
- 小时 (Hours):0-23
- 日期 (Day of month):1-31
- 月份 (Month):1-12 或者 JAN-DEC
- 星期 (Day of week):0-7(0 和 7 都表示周日)或者 SUN-SAT
- 年份 (Year):1970-2099(可选字段,通常在许多实现中省略)
字段的特殊字符
*****:表示任何值。例如,在分钟字段中使用*表示每分钟**,**:表示枚举值。例如,在分钟字段中使用0,15,30,45表示每小时的第 0、15、30 和 45 分钟**-**:表示范围。例如,在小时字段中使用9-17表示从 9 点到 17 点(即 9 AM 到 5 PM)**/**:表示步长。例如,在分钟字段中使用*/5表示每 5 分钟**?**:表示无特定值,仅用于日期和星期字段,以避免与其他字段冲突。例如,如果你指定了一个特定的日期,而星期字段不需要特别指定,则可以使用?**L**:表示最后一个。例如,在日期字段中使用L表示一个月的最后一天,在星期字段中使用L表示一周的最后一天(周六)**W**:表示工作日(周一到周五),仅用于日期字段。例如,15W表示最接近 15 日的工作日**#**:表示第几个星期几,仅用于星期字段。例如,3#2表示某月的第二个星期三
示例
- 每分钟执行一次
bash
* * * * *- 每小时的第 5 分钟执行一次
bash
5 * * * *- 每天凌晨 0:00 执行一次
bash
0 0 * * *- 每周一凌晨 0:00 执行一次
bash
0 0 * * 1- 每个月的 1 号和 15 号凌晨 0:00 执行一次
bash
0 0 1,15 * *- 每个工作日(周一到周五)的凌晨 0:00 执行一次
bash
0 0 * * 1-5- 每隔 5 分钟执行一次
bash
*/5 * * * *- 每隔 2 小时执行一次
bash
0 */2 * * *- 每个周日凌晨 1:30 执行一次
bash
30 1 * * 0- 每月的最后一天凌晨 0:00 执行一次
bash
0 0 L * *- 每个季度的第一天凌晨 0:00 执行一次,每年的 1 月、4 月、7 月和 10 月的 1 号的 0:00 触发一次任务。
bash
0 0 1 1,4,7,10 *- 每年 12 月的每个工作日的凌晨 0:00 执行一次
bash
0 0 * 12 1-5解析示例
示例表达式:
bash
30 4 1 * 2- 分钟:30 分钟
- 小时:4 点
- 日期:每月的 1 号
- 月份:任何月份
- 星期:星期二
解释:这个任务会在每个月的 1 号的星期二的 4:30 AM 触发。如果 1 号不是星期二,那么本月不会有任何任务触发
示例表达式:
bash
0 22 * * 1-5- 分钟:0 分钟
- 小时:22 点
- 日期:任何日期
- 月份:任何月份
- 星期:周一到周五
解释:这个任务会在每周一到周五的 22:00(晚上 10 点)触发。
理解和编写 CRON 表达式需要一定的练习,但掌握了之后,可以非常灵活地定义各种定时任务。使用在线 CRON 表达式生成器和解释器工具(如 crontab.guru)可以帮助你更容易地创建和验证这些表达式
版本差异(CRON 表达式 → Spring 6.x)
| 特性 | 旧版(Spring 5) | 当前(Spring 6.x) |
|---|---|---|
| CRON 格式 | 6 字段(秒 分 时 日 月 周) | 不变;7 字段(年)可选 |
| ISO-8601 | 不支持 | @Scheduled 支持 ISO-8601 周期格式(如 PT30M) |
| 语义 | 标准 cron | 不变;crontab.guru 等工具仍可用于校验 |
| 时区 | 默认系统时区 | 可配置 timeZone 属性 |
CRON 表达式语法(* ? L W # 等)与各字段含义不随版本变化;Spring 6.x 新增 ISO-8601 周期格式,crontab.guru 校验思路不变。