IIWAB

Java Cron表达式说明

IIWAB 29天前 ⋅ 88 阅读

Java中Quartz定时框架使用的cron是6~7位,顺序:秒 分 时 日 月 周 [年],年是可选; ⚠️注意:SpringBoot 中@Scheduled注解默认也是 Quartz 格式,6位(秒 分 时 日 月 周),不带年

字段顺序(6位,Spring @Scheduled)

序号字段允许值允许特殊符号
10‑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. *:匹配该字段每一个值。例:秒位写*=每一秒
  2. ?:无指定值,用于【日/星期】二选一,解决冲突
  3. -:范围。1‑5 1到5
  4. ,:多个值。1,3,5 1、3、5
  5. /:增量,A/B:从A开始,每B执行一次。0/5从0开始每5个单位
  6. L:last,最后。日字段L当月最后一天;星期6L当月最后一个星期五
  7. W:工作日,就近工作日,仅日期字段。10W每月10号最近的工作日
  8. #:第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点执行

常见踩坑

  1. ❌错误:0 0 0 1 * 1 同时写了日和星期,冲突,必须其中一个改为? ✅正确:0 0 0 1 * ? 每月1号零点 ✅正确:0 0 0 ? * 1 每周日零点

  2. linux crontab是5位(分 时 日 月 周),不要直接复制到Java @Scheduled,少了秒字段,会不生效!

  3. 星期:1=周日,不是周一,很多人在这里写错。

  4. L W # 只能用于星期/日期字段,不能用在秒分小时。

补充:@Scheduled其他写法对比

// cron表达式
@Scheduled(cron = "0 0 2 * * ?")
// fixedRate:间隔时间,不管上一次是否执行完
@Scheduled(fixedRate = 5000)
// fixedDelay:上一次执行结束后,间隔多久再执行
@Scheduled(fixedDelay = 5000)

全部评论: 0

    我有话说: