Spring Cron 教程
一、语法概述
Spring Cron 由 6 个时间字段组成,以空格分隔,格式为:秒 分 时 日 月 周
* * * * * * - - - - - - | | | | | | | | | | | +------ 周 (0 ~ 7 , 周天 = 0 or 7, 周一~周六 = 1~6 或者 SUN,MON,TUE,WED,THU,FRI,SAT) | | | | +---------- 月 (1 - 12 或者 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC) | | | +-------------- 日 (1 - 31) | | +------------------ 时 (0 - 23) | +---------------------- 分 (0 - 59) +-------------------------- 秒 (0 - 59)
Spring通过
自Spring5.3版本,开始支持
@Scheduled(cron = "...") 支持 cron 表达式调度定时任务。自Spring5.3版本,开始支持
?、L、W、# 等高级符号,以满足业务的个性化需求。更多请参考:Spring 官方文档
二、字段说明
2.1 每个域允许的值
| 位置 | 字段名 | 必填 | 取值范围 | 特殊字符 |
|---|---|---|---|---|
| 1 | 秒 | 是 | 0-59 | * - / , |
| 2 | 分 | 是 | 0-59 | * - / , |
| 3 | 时 | 是 | 0-23 | * - / , |
| 4 | 日 | 是 | 1-31 | * - / , ? L W |
| 5 | 月 | 是 | 1-12 或 JAN-DEC | * - / , |
| 6 | 周 | 是 | 0-7 或 SUN-SAT(0 与 7 均为周日) | * - / , ? L # |
2.2 特殊字符的含义
| 字符 | 含义 | 示例 |
|---|---|---|
| * | 表示匹配域的任意值 | 0 * * * * ? 表示每分钟的第 0 秒执行一次。 |
| - | 表示区间范围 | 0 0 9-17 * * ? 表示每天 9 点到 17 点,每小时整点执行。 |
| / | 表示起始时间起,每隔固定间隔执行 | 0 0/5 * * * ? 表示从 0 分起,每 5 分钟执行一次。 |
| , | 表示列出枚举值 | 0 0 8,12,18 * * ? 表示每天 8 点、12 点、18 点执行。 |
| ? | 不指定;只能用于「日」和「周」字段 | 0 0 0 15 * ? 每月 15 号凌晨执行;0 0 0 ? * MON 每周一凌晨执行。 |
| L | 最后;用于「日」表示本月最后一天,用于「周」表示本月最后一个星期 X | 0 0 0 L * ? 每月最后一天凌晨;0 0 0 ? * 6L 每月最后一个周五(Spring 5.3+)。 |
| W | 离指定日期最近的工作日;只能用于「日」字段 | 0 0 0 15W * ? 每月最接近 15 号的工作日凌晨(Spring 5.3+)。 |
| # | 第几个星期几;只能用于「周」字段,格式为 星期#序号 | 0 0 0 ? * 6#3 每月第 3 个周五(Spring 5.3+)。 |
三、各个字符详解
1. 星号 * (通配符)
含义:代表该字段所有有效的取值。
0 * * * * ? 每分钟的第 0 秒执行
0 0 * * * ? 每小时整点执行
0 0 0 * * ? 每天凌晨执行
0 0 * * * ? 每小时整点执行
0 0 0 * * ? 每天凌晨执行
2. 逗号 , (指定多个值)
含义:用于列表形式,表示多个时间点。
0 0 8,12,18 * * ? 每天 8 点、12 点、18 点执行
0 0 9 ? * MON,WED,FRI 每周一、三、五上午 9 点执行
0 0,30 * * * ? 每小时的 0 分、30 分执行
0 0 9 ? * MON,WED,FRI 每周一、三、五上午 9 点执行
0 0,30 * * * ? 每小时的 0 分、30 分执行
3. 连字符 - (指定范围)
含义:定义连续范围。
0 0 9-17 * * ? 每天 9~17 点,每小时整点执行
0 0 0 1-5 * ? 每月 1~5 号凌晨执行
0 0/5 9-17 * * MON-FRI 工作日 9~17 点,每 5 分钟执行
0 0 0 1-5 * ? 每月 1~5 号凌晨执行
0 0/5 9-17 * * MON-FRI 工作日 9~17 点,每 5 分钟执行
4. 斜杠 / (指定步长)
含义:指定间隔频率。
0 0/15 * * * ? 从 0 分起,每 15 分钟执行
0 0 0/2 * * ? 从 0 点起,每 2 小时执行
0 0/30 8-20 * * ? 8~20 点内,每 30 分钟执行
0 0 0/2 * * ? 从 0 点起,每 2 小时执行
0 0/30 8-20 * * ? 8~20 点内,每 30 分钟执行
5. 问号 ? (不指定)
含义:仅用于「日」和「周」字段,表示不指定该字段;两者有且只能有一个为 ?。
0 0 0 15 * ? 每月 15 号凌晨(不关心星期几)
0 0 0 ? * MON 每周一凌晨(不关心几号)
0 0 12 ? * MON-FRI 每个工作日上午 12 点
0 0 0 ? * MON 每周一凌晨(不关心几号)
0 0 12 ? * MON-FRI 每个工作日上午 12 点
四、关于「日」和「周」字段
Spring Cron 中,「日」与「周」字段不能同时指定具体值,必须有一个为 ?,否则表达式无效或行为不符合预期。
正确示例:
0 0 0 1 * ? 每月 1 号凌晨
0 0 0 ? * MON 每周一凌晨
错误示例:
0 0 0 1 * MON 「日」和「周」同时指定,应避免
0 0 0 1 * ? 每月 1 号凌晨
0 0 0 ? * MON 每周一凌晨
错误示例:
0 0 0 1 * MON 「日」和「周」同时指定,应避免
最佳实践:
- 1. 按「星期几」调度 → 「日」写
?,「周」写具体值 - 2. 按「几号」调度 → 「周」写
?,「日」写具体值 - 3. 每天都执行 → 「日」和「月」写
*,「周」写?,如0 0 0 * * ?
五、综合示例
| 表达式 | 含义解释 |
|---|---|
| 0 0 0 * * ? | 每天凌晨 0 点整。 |
| 0 0/5 * * * ? | 每 5 分钟执行一次。 |
| 0 0 8 * * MON-FRI | 每个工作日上午 8 点。 |
| 0 0 0 1 * ? | 每月 1 号凌晨。 |
| 0 0 0 ? * SAT,SUN | 每周六、周日凌晨。 |
| 0 0 2 ? * SAT,SUN | 每周六、周日凌晨 2 点(常用于周末备份)。 |
| 0 0 0 L * ? | 每月最后一天凌晨(Spring 5.3+)。 |
| 0 0 0 ? * 6#2 | 每月第 2 个周五凌晨(Spring 5.3+)。 |
六、总结
Spring Cron 常用核心符号:
* (所有)
, (或)
- (到)
/ (每隔)
? (不指定,用于日/周)
, (或)
- (到)
/ (每隔)
? (不指定,用于日/周)
在线生成与验证可使用本站 Spring Cron 生成器。
沪公网安备31010502007519号