小算云箱小算云箱
← 返回使用指南

Cron 表达式从入门到上手:5 段与 6/7 段差异、常用写法与快速验证

2026-05-08小算团队开发辅助

用工程视角讲清 Cron 的字段含义(分/时/日/月/周/秒/年)、5 段与 Quartz 6/7 段的关键差异(尤其 ? 与日/周二选一),并给出高频场景模板;配合小算云箱 Cron 工具做校验与未来触发时间验证。

A. 痛点描述(Problem)#

Cron 最大的问题是:它看起来很短,但错误成本很高:

  • 少写/多写一段字段,任务就完全不按预期执行
  • 日(Day of Month)与周(Day of Week)写法混用,Quartz 直接判非法
  • 明明想“每 5 分钟”,却写成“每小时的第 5 分钟”
  • 上线后才发现时区不一致,触发时间整体偏移

最稳的做法是:写表达式 + 立刻算出未来触发时间,确认与业务预期一致再落地。

工具入口:Cron 生成与解析
👉 立即使用:Cron 生成与解析


B. 核心原理(Deep Dive)——5 段与 6/7 段 Cron 的关键差异#

1)经典 crontab(5 段)#

常见于 Linux:

  • 分 时 日 月 周

例:每 5 分钟

  • */5 * * * *

2)Quartz Cron(6 段 / 7 段)#

很多 Java 体系与调度框架使用 Quartz 风格:

  • 6 段:秒 分 时 日 月 周
  • 7 段:秒 分 时 日 月 周 年

关键点:Quartz 中通常需要“二选一”,另一段写 ? 表示“不指定”。

例:每周一 08:00(用周,不用日)

  • 0 0 8 ? * MON

例:每月 1 日 02:00(用日,不用周)

  • 0 0 2 1 * ?

C. 字段速查(你至少要记住这张表)#

以 6 段 Quartz 为例:

  1. 秒:0-59
  2. 分:0-59
  3. 时:0-23
  4. 日:1-31 / 特殊值(如 L、LW 等)
  5. 月:1-12 或 JAN-DEC
  6. 周:0-7 或 SUN-SAT(不同实现略有差异)

工程建议:

  • 先把你想要的“人类时间”写清楚(每几分钟、每天几点、每周几)
  • 再映射到字段,最后用工具算未来触发时间验证

D. 高频模板(直接复制)#

👉 用工具验证未来触发时间:立即使用:Cron 生成与解析

1)每分钟 / 每 N 分钟#

  • 每分钟:0 * * * * ?
  • 每 5 分钟:0 0/5 * * * ?
  • 每 15 分钟:0 0/15 * * * ?
  • 5 段兼容(每 5 分钟):*/5 * * * *

易错点:
5 * * * * 代表“每小时的第 5 分钟”,不是“每 5 分钟”。

2)每天固定时间#

  • 每天 00:00:0 0 0 * * ?
  • 每天 08:00:0 0 8 * * ?
  • 每天 23:59:0 59 23 * * ?

3)工作时间周期触发#

  • 工作时间每半小时(9-17 点):0 0/30 9-17 * * ?

4)按周(周一到周五 / 周末)#

  • 每周一 08:00:0 0 8 ? * MON
  • 周一至周五 10:15:0 15 10 ? * MON-FRI
  • 周末 10:00:0 0 10 ? * SAT,SUN

5)按月(每月 1 日 / 最后一天)#

  • 每月 1 日 02:00:0 0 2 1 * ?
  • 每月 15 日 12:00:0 0 12 15 * ?
  • 每月最后一天 10:15:0 15 10 L * ?
  • 每月最后工作日(部分实现支持):0 0 18 LW * ?

E. 操作指南(Step-by-step)——用工具把 Cron 写稳#

👉 立即使用:Cron 生成与解析

  1. 粘贴你的表达式(支持 5-7 段)
  2. 看解析结果是否能正确拆分字段,并输出规范化表达式
  3. 选择时区/起始时间(如有),生成未来 N 次触发时间
  4. 用“未来触发时间”对照业务预期(尤其跨时区与 DST 的场景)

F. 常见问题(FAQ)#

1)为什么提示“日与周必须二选一,另一段应为 ?”?#

这是 Quartz 风格 Cron 的规则:日(DayOfMonth)与周(DayOfWeek)同时指定会产生歧义,因此要求其中一个写 ?

2)5 段与 6 段写法能混用吗?#

不能直接混用。5 段没有“秒”,而 Quartz 多了“秒”并引入 ? 等语义。建议用工具统一解析与规范化后再落地。

3)为什么“每 5 分钟”经常写错?#

*/5 表示步进(每 5),而 5 是固定值(第 5)。因此“每 5 分钟”是 */50/5 的语义。


工具推荐#