CRON 表达式是一种用于定义定时任务的格式,通常用于 Unix 和类 Unix 系统中的 cron 调度程序。它由 5 到 7 个字段组成,字段之间用空格分隔,从左到右分别表示秒、分钟、小时、日期、月份、星期和年份(年份为可选字段)。一般格式如下:
秒 分钟 小时 日期 月份 星期 年(可选)*****:表示任何值。例如,在分钟字段中使用 * 表示每分钟**,**:表示枚举值。例如,在分钟字段中使用 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 表示某月的第二个星期三* * * * *5 * * * *0 0 * * *0 0 * * 10 0 1,15 * *0 0 * * 1-5*/5 * * * *0 */2 * * *30 1 * * 00 0 L * *0 0 1 1,4,7,10 *0 0 * 12 1-5示例表达式:
30 4 1 * 2解释:注意标准 cron 的一个重要语义——当"日期"与"星期"两个字段同时被限制(都不是 *)时,二者是或的关系:每月 1 号或每个星期二的 4:30 AM 都会触发,而不是"1 号且星期二"。若要表达"仅当 1 号恰逢星期二才执行",标准 cron 无法直接表达,需要在脚本中自行判断星期。
示例表达式:
0 22 * * 1-5解释:这个任务会在每周一到周五的 22:00(晚上 10 点)触发。
理解和编写 CRON 表达式需要一定的练习,但掌握了之后,可以非常灵活地定义各种定时任务。使用在线 CRON 表达式生成器和解释器工具(如 crontab.guru)可以帮助你更容易地创建和验证这些表达式
| 特性 | 旧版(Spring 5) | 当前(Spring 6.x) |
|---|---|---|
| CRON 格式 | 6 字段(秒 分 时 日 月 周) | 不变;7 字段(年)可选 |
| ISO-8601 | 5.0~5.2 不支持(5.3 起支持) | @Scheduled 支持 ISO-8601 周期格式(如 PT30M) |
| 语义 | 标准 cron | 不变;crontab.guru 等工具仍可用于校验 |
| 时区 | 默认系统时区 | 可配置 timeZone 属性 |
CRON 表达式语法(* ? L W # 等)与各字段含义不随版本变化;ISO-8601 周期格式自 Spring 5.3 起支持,crontab.guru 校验思路不变。