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 为例:
- 秒:0-59
- 分:0-59
- 时:0-23
- 日:1-31 / 特殊值(如 L、LW 等)
- 月:1-12 或 JAN-DEC
- 周: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 写稳#
- 粘贴你的表达式(支持 5-7 段)
- 看解析结果是否能正确拆分字段,并输出规范化表达式
- 选择时区/起始时间(如有),生成未来 N 次触发时间
- 用“未来触发时间”对照业务预期(尤其跨时区与 DST 的场景)
F. 常见问题(FAQ)#
1)为什么提示“日与周必须二选一,另一段应为 ?”?#
这是 Quartz 风格 Cron 的规则:日(DayOfMonth)与周(DayOfWeek)同时指定会产生歧义,因此要求其中一个写 ?。
2)5 段与 6 段写法能混用吗?#
不能直接混用。5 段没有“秒”,而 Quartz 多了“秒”并引入 ? 等语义。建议用工具统一解析与规范化后再落地。
3)为什么“每 5 分钟”经常写错?#
*/5 表示步进(每 5),而 5 是固定值(第 5)。因此“每 5 分钟”是 */5 或 0/5 的语义。
工具推荐#
- Cron 生成与解析(校验 + 未来触发时间):立即使用:Cron 生成与解析
