Java中
Quartz定时框架使用的cron是6~7位,顺序:秒 分 时 日 月 周 [年],年是可选; ⚠️注意:SpringBoot 中@Scheduled注解默认也是 Quartz 格式,6位(秒 分 时 日 月 周),不带年。
字段顺序(6位,Spring @Scheduled)
| 序号 | 字段 | 允许值 | 允许特殊符号 |
|---|---|---|---|
| 1 | 秒 | 0‑59 | , - * / |
| 2 | 分钟 | 0‑59 | , - * / |
| 3 | 小时 | 0‑23 | , - * / |
| 4 | 日期(日) | 1‑31 | , - * / ? L W C |
| 5 | 月份 | 1‑12 或 JAN‑DEC | , - * / |
| 6 | 星期 | 1‑7(1=周日,7=周六) 或 SUN‑SAT | , - * / ? L C # |
重点:日 和 星期 两个字段互斥,一个赋值,另一个必须写
?,不能同时指定日期和星期,否则冲突报错。
特殊符号含义
*:匹配该字段每一个值。例:秒位写*=每一秒?:无指定值,用于【日/星期】二选一,解决冲突-:范围。1‑51到5,:多个值。1,3,51、3、5/:增量,A/B:从A开始,每B执行一次。0/5从0开始每5个单位L:last,最后。日字段L当月最后一天;星期6L当月最后一个星期五W:工作日,就近工作日,仅日期字段。10W每月10号最近的工作日#:第N个星期,仅星期字段。2#3每月第3个星期一
⚠️坑点:星期编码:Quartz中1=周日,2=周一…7=周六,和很多linux cron不一样!
常用示例(Spring @Scheduled 6位格式)
// 每5秒执行一次
@Scheduled(cron = "0/5 * * * * ?")
// 每分钟0秒执行
@Scheduled(cron = "0 * * * * ?")
// 每5分钟执行一次,0秒触发
@Scheduled(cron = "0 0/5 * * * ?")
// 每小时整点执行(0分0秒)
@Scheduled(cron = "0 0 * * * ?")
// 每天凌晨0点执行
@Scheduled(cron = "0 0 0 * * ?")
// 每天凌晨2点30分执行
@Scheduled(cron = "0 30 2 * * ?")
// 每周一早上8点执行(星期2代表周一,日期写?)
@Scheduled(cron = "0 0 8 ? * 2")
// 每月1号凌晨3点执行
@Scheduled(cron = "0 0 3 1 * ?")
// 每月最后一天23点59分50秒执行
@Scheduled(cron = "50 59 23 L * ?")
// 每月第三个星期五 22点执行,5代表周五,#3第3个
@Scheduled(cron = "0 0 22 ? * 5#3")
// 工作日周一‑周五,早上9点30分
@Scheduled(cron = "0 30 9 ? * 2‑6")
// 每天的 9点、14点、18点整执行
@Scheduled(cron = "0 0 9,14,18 * * ?")
// 从8点到18点,每30分钟执行一次
@Scheduled(cron = "0 0/30 8‑18 * * ?")
Quartz完整7位(带年,年可选,1970‑2099)
格式:秒 分 时 日 月 周 年
例:0 0 0 * * ? 2026 →2026年每天0点执行
常见踩坑
-
❌错误:
0 0 0 1 * 1同时写了日和星期,冲突,必须其中一个改为?✅正确:0 0 0 1 * ?每月1号零点 ✅正确:0 0 0 ? * 1每周日零点 -
linux crontab是5位(分 时 日 月 周),不要直接复制到Java @Scheduled,少了秒字段,会不生效!
-
星期:1=周日,不是周一,很多人在这里写错。
-
L W #只能用于星期/日期字段,不能用在秒分小时。
补充:@Scheduled其他写法对比
// cron表达式
@Scheduled(cron = "0 0 2 * * ?")
// fixedRate:间隔时间,不管上一次是否执行完
@Scheduled(fixedRate = 5000)
// fixedDelay:上一次执行结束后,间隔多久再执行
@Scheduled(fixedDelay = 5000)
注意:本文归作者所有,未经作者允许,不得转载