quartz、springboot 定时任务:cron表达式

介绍

cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。

语法

格式:

[秒] [分] [小时] [日] [月] [周] [年]
位置 字段 允许值范围 特殊字符 说明
1 秒 0-59 , - * / 例如:0 表示整秒触发
2 分 0-59 , - * / 例如:30 表示 30 分触发
3 时 0-23 , - * / 例如:2 表示凌晨 2 点
4 日 1-31 , - * / ? L W C 注意:“日”和“周”通常不同时指定(用 ? 避免冲突)
5 月 1-12 或 JAN-DEC , - * / 例如:1 或 JAN 表示 1 月
6 周 1-7 或 SUN-SAT(1=SUN) , - * / ? L C # 例如:1 或 SUN 表示周日
7 年(可选) 1970-2099 , - * / 省略时表示每年

特殊字符含义

特殊字符用于灵活定义时间规则,核心用法如下:

字符 含义 示例
* 匹配该字段的所有可能值(“每”) 分钟字段为 * → 每分钟触发
? 仅用于“日”和“周”,表示“不指定值”(避免两者冲突) 日字段为 ? 且周字段为 1 → 每周日触发(不指定具体日期)
- 表示范围 小时字段 9-17 → 9 点到 17 点之间每小时触发
, 表示多个值(列表) 周字段 1,3 → 周日和周二触发(1=SUN,3=TUE)
/ 表示“间隔”(步长),格式:起始值/步长 秒字段 0/10 → 从 0 秒开始,每 10 秒触发一次(0,10,20,…50 秒)
L 仅用于“日”和“周”,表示“最后” 日字段 L → 当月最后一天;周字段 L → 当月最后一个周日
W 仅用于“日”,表示“最近的工作日”(周一到周五) 日字段 15W → 15 日最近的工作日(若 15 日是周六,则 14 日周五触发)
# 仅用于“周”,格式:n#m 表示“第 m 个星期 n” 周字段 3#2 → 当月第 2 个周二(3=TUE)

注意:除了 {日期} 和 {星期} 可以使用 ? 来实现互斥,表达无意义的信息之外,其他占位符都要具有具体的时间含义,且依赖关系为:年->月->日期(星期)->小时->分钟->秒数

Quartz 与 Spring Boot 的差异

“年”字段

  • Quartz 支持第 7 个字段(年),例如 0 0 0 1 1 ? 2024 表示 2024 年 1 月 1 日执行。
  • Spring Boot 的 @Scheduled 注解不支持“年”字段(仅 6 个字段),若需限制年份,需在代码中判断。

“周”的编号

  • 两者均支持 SUN-SAT(周日到周六),但数字编号中,Quartz 中 1=SUN,而部分系统中 0=SUN,建议用英文缩写(如 SUN)避免混淆。

常用示例(Quartz + Spring Boot 通用)

1. 基础频率

  • 0 0 2 * * ? → 每天凌晨 2 点整执行
  • 0 30 10 * * ? → 每天上午 10 点 30 分执行
  • 0 0/30 9-18 * * ? → 每天 9 点到 18 点之间,每 30 分钟执行一次
  • 0 * 14 * * ? → 每天 14 点到 15 点之间,每分钟执行一次(整分触发)

2. 每周/每月

  • 0 0 12 ? * 1 → 每周日中午 12 点执行(1=SUN)
  • 0 0 10 ? * 3#2 → 每月第 2 个周二上午 10 点执行(3=TUE)
  • 0 0 23 L * ? → 每月最后一天晚上 23 点执行

3. 特殊场景

  • 0 0 1 1 * ? → 每年 1 月 1 日凌晨 1 点执行(新年触发)
  • 0 0 8,12,18 * * ? → 每天 8 点、12 点、18 点各执行一次
  • 0 15 10 ? * MON-FRI → 每周一到周五上午 10 点 15 分执行

其他常用示例

0 0 12 * * ?    每天12点触发
0 15 10 ? * *    每天10点15分触发
0 15 10 * * ?    每天10点15分触发
0 15 10 * * ? *    每天10点15分触发
0 15 10 * * ? 2005    2005年每天10点15分触发
0 * 14 * * ?    每天下午的 2点到2点59分每分触发
0 0/5 14 * * ?    每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ?    每天下午的 2点到2点59分(整点开始,每隔5分触发)每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ?    每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED    3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI    从周一到周五每天上午的10点15分触发
0 15 10 15 * ?    每月15号上午10点15分触发
0 15 10 L * ?    每月最后一天的10点15分触发
0 15 10 ? * 6L    每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005    从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3    每月的第三周的星期五开始触发
0 0 12 1/5 * ?    每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ?    每年的11月11号 11点11分触发(光棍节)

生成器

https://www.bejson.com/othertools/cron/

参考:
https://blog.csdn.net/pan_junbiao/article/details/109399280
https://blog.csdn.net/m0_37179470/article/details/81271607


原文出处:/show_1IX5tSMcAzUy.html