无论是使用 Linux 系统底层的 crontab -e 执行定时备份,还是在 Java Spring Boot、Node.js、Python 中运行定时调度任务,Cron 表达式都是开发者无法绕开的技术规范。
一个字符写错,就可能导致本该夜间执行的数据归档在业务高峰期突发运行。本文将用最通俗易懂的方式拆解各字段位置与常用通配符,让你不再畏惧定时表达式。
1. 5 位、6 位与 7 位 Cron 表达式对比
不同框架和运行环境对 Cron 的字段定义略有差异,切勿生搬硬套:
- Linux 原生 Crontab(标准 5 位):格式为
分 时 日 月 周(最小单位为“分”); - Java / Spring Task(常用 6 位):格式为
秒 分 时 日 月 周(第一位精确到“秒”); - Quartz 调度框架(完整 7 位):格式为
秒 分 时 日 月 周 年(末位增加了可选的年份)。
2. 各字段的取值范围与位置定义(以 6 位为例)
| 字段位置 | 字段名称 | 允许值范围 | 允许的特殊通配符 |
|---|---|---|---|
| 第 1 位 | 秒(Seconds) | 0 - 59 | * , - / |
| 第 2 位 | 分(Minutes) | 0 - 59 | * , - / |
| 第 3 位 | 时(Hours) | 0 - 23 | * , - / |
| 第 4 位 | 日(Day of Month) | 1 - 31 | * , - / ? L W |
| 第 5 位 | 月(Month) | 1 - 12 或 JAN-DEC | * , - / |
| 第 6 位 | 周(Day of Week) | 1 - 7 或 SUN-SAT | * , - / ? L # |
3. 核心通配符的含义精解
- 星号
*:代表“每一”。例如在分钟位上写*,表示每分钟都会触发; - 斜杠
/:代表“步长/递增”。例如0/5在分钟位表示从第 0 分钟开始,每隔 5 分钟执行一次; - 短横线
-:代表“区间连续范围”。例如9-18在小时位表示每天 9 点到 18 点之间触发; - 逗号
,:代表“枚举列举”。例如1,3,5在周位表示每周一、三、五执行; - 问号
?:代表“无特定值”。由于“日期(Day of Month)”和“星期(Day of Week)”通常互斥,当指定了其中一个时,另一个必须填写?,避免语义冲突。
4. 经典高频定时任务表达式速查
0 0 12 * * ? -> 每天中午 12:00:00 准时触发
0 0/15 * * * ? -> 每隔 15 分钟触发一次 (00, 15, 30, 45分)
0 0 2 * * ? -> 每天凌晨 02:00 执行 (适合数据夜间冷备)
0 30 9 ? * MON-FRI -> 每周一到周五上午 09:30 触发 (适合工作日开市提醒)
0 0 0 1 * ? -> 每月 1 号凌晨 00:00 执行 (适合月度报表统计)
0 0 23 L * ? -> 每月最后一天晚上 23:00 触发 (L 表示 Last)
5. 在线生成与推算未来执行时间
手动编写容易遗漏通配符细节,建议使用易处理 Cron表达式生成器:通过勾选直观的可视化界面,自动拼接出符合规范的 Cron 字符串,并实时模拟出接下来 5 次的精确执行时间点,确保逻辑万无一失。