{T}

CRON 表达式

CRON 表达式是一种用于定义定时任务的格式,通常用于 Unix 和类 Unix 系统中的 cron 调度程序。CRON 表达式由 5 个到 7 个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年份(年份为可选字段)。每个字段使用空格分隔。每个字段代表一个时间单位,包括秒、分钟、小时、日期、月份、星期和年(可选)。以下是 CRON 表达式的一般格式:

plain
秒 分钟 小时 日期 月份 星期 年(可选)

CRON 表达式字段

  1. 秒 (Seconds):0-59(可选字段,通常在许多实现中省略)
  2. 分钟 (Minutes):0-59
  3. 小时 (Hours):0-23
  4. 日期 (Day of month):1-31
  5. 月份 (Month):1-12 或者 JAN-DEC
  6. 星期 (Day of week):0-7(0 和 7 都表示周日)或者 SUN-SAT
  7. 年份 (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 表示某月的第二个星期三

示例

  1. 每分钟执行一次
bash
* * * * *
  1. 每小时的第 5 分钟执行一次
bash
5 * * * *
  1. 每天凌晨 0:00 执行一次
bash
0 0 * * *
  1. 每周一凌晨 0:00 执行一次
bash
0 0 * * 1
  1. 每个月的 1 号和 15 号凌晨 0:00 执行一次
bash
0 0 1,15 * *
  1. 每个工作日(周一到周五)的凌晨 0:00 执行一次
bash
0 0 * * 1-5
  1. 每隔 5 分钟执行一次
bash
*/5 * * * *
  1. 每隔 2 小时执行一次
bash
0 */2 * * *
  1. 每个周日凌晨 1:30 执行一次
bash
30 1 * * 0
  1. 每月的最后一天凌晨 0:00 执行一次
bash
0 0 L * *
  1. 每个季度的第一天凌晨 0:00 执行一次,每年的 1 月、4 月、7 月和 10 月的 1 号的 0:00 触发一次任务。
bash
0 0 1 1,4,7,10 *
  1. 每年 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 校验思路不变。