场景先于语法
绝大多数定时需求就六七种:每分钟轮询、每小时清理、每天凌晨跑批、每周一汇总、每月一号结算、工作日早上提醒。先按场景抄表达式,再理解字段,是掌握 Cron 最快的路径。
在线 Cron 表达式工具把这条路径做成了默认动线:预设区一键填入,中文含义立即显示,下面直接给出接下来 5 次执行时间。
高频场景表达式速记
| 场景 | 表达式 | 说明 |
|---|---|---|
| 每分钟 | * * * * * |
轮询、探活 |
| 每 5 分钟 | */5 * * * * |
步进写法,指标采集常用 |
| 每小时(第 0 分) | 0 * * * * |
分钟位 0 + 小时位 * |
| 每天零点 | 0 0 * * * |
日志切割、跑批 |
| 每周一 9 点 | 0 9 * * 1 |
周位 1=周一(0 或 7=周日) |
| 每月 1 号零点 | 0 0 1 * * |
月结、账单 |
| 工作日 8:30 | 30 8 * * 1-5 |
周位区间表示周一至周五 |
五个字段从左到右是:分 时 日 月 周。记忆口诀「分时日月周」,范围分别是 0-59、0-23、1-31、1-12、0-7。
最高频的三个笔误
- 每小时写成每分钟:
* * * * *与0 * * * *只差一个字符,含义天差地别——前者每分钟跑一次。想清楚分钟位该填什么再写。 - 日和周打架:crontab 里日和周同时指定是「或」关系(任一满足即执行),不是「且」。想表达「每月 1 号且是周一」需要条件判断,单靠表达式做不到。
- Quartz 少写秒位:Spring 项目抄了 Linux crontab 的 5 段表达式,Quartz 调度器会直接报错——6 段开头是秒。
Quartz 与 crontab:先确认调度器
| 维度 | crontab | Quartz |
|---|---|---|
| 段数 | 5(分时日月周) | 6(秒+分时日月周) |
| 最小粒度 | 分钟 | 秒 |
? 占位 |
不支持 | 日/周之一可用 ? 表示不指定 |
| 生态 | Linux crontab 命令 | Quartz / Spring @Scheduled |
按调度器选格式,别让表达式跨生态。解析工具顶部有格式切换,粘贴错格式会提示。
怎么验证写对了
最快的方式是看接下来 5 次执行时间:粘进 Cron 表达式在线工具,如果列表里的时刻和你脑中的预期一致,表达式就是对的;不一致时对照中文含义和逐字段说明找差异。上线后以日志的首条执行时间为准复核一遍,跨时区部署记得按服务器时区折算。
常见问题
Cron 表达式每小时执行一次应该怎么写?
0 * * * *:分钟位填 0,小时位用 *。要在每小时的第 30 分执行就写 30 * * * *。注意分钟位写 * 会变成每分钟执行一次——这是最高频的笔误。
crontab 和 Quartz 的表达式能混用吗?
不能直接混用。crontab 是 5 段(最小粒度分钟),Quartz 是 6 段(开头多一个秒位)。Linux crontab 不认 6 段,Quartz 调度器需要秒位。写之前先确认调度器类型,解析工具按格式切换即可。
怎么确认表达式会在预期的时间执行?
把表达式粘进在线解析工具看接下来 5 次执行时间,与预期对照最快。生产环境再配合日志的首条执行时间复核;跨时区部署时注意执行时间按服务器时区计算。