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通过 @Scheduled(cron = "...") 支持 cron 表达式调度定时任务。
自Spring5.3版本,开始支持 ?LW# 等高级符号,以满足业务的个性化需求。更多请参考: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 * * ?     每天凌晨执行

2. 逗号 , (指定多个值)

含义:用于列表形式,表示多个时间点。

0 0 8,12,18 * * ?     每天 8 点、12 点、18 点执行
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 分钟执行

4. 斜杠 / (指定步长)

含义:指定间隔频率。

0 0/15 * * * ?      从 0 分起,每 15 分钟执行
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 点

四、关于「日」和「周」字段

Spring Cron 中,「日」与「周」字段不能同时指定具体值,必须有一个为 ?,否则表达式无效或行为不符合预期。

正确示例:
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 生成器