定时任务为什么少跑了一次、或者一天跑了两次?
日字段是「或」不是「与」,周日有 0 和 7 两个写法,凌晨还会撞夏令时。
最常见的两个根因:一是「日字段(day of month)与星期字段(day of week)同时被限定」时,标准 cron 的语义是或——0 0 1 * 1 的含义是每月 1 号或每周一,而不是「既是 1 号又是周一」,所以你会看到它比预期跑得多;二是字段数贴错,5 段是 crontab(分 时 日 月 周)、6 段是 Quartz(秒 分 时 日 月 周),把 6 段表达式贴进 crontab,分钟位被当成小时位,任务就会整天跑。
还有两个容易忽略的点:星期日的写法在 crontab 里 0 和 7 都行,而 Quartz 的星期是 1 到 7、周日等于 1,同一个表达式换平台就失效;夏令时拨快那天,凌晨 2 点到 3 点这个不存在的时段里的任务会被直接跳过,拨回时则会重复执行一次。
cron 表达式短得像咒语,出错也很难看出错在哪里——写的时候通读三遍觉得没问题,跑起来却发现每周多跑一次,或者某个凌晨的任务一个月都没执行。
这些现象背后其实是几条很具体的规则:有的字段之间是「或」关系,有的平台给同一件事定义了两个编号,还有夏令时这种日历层面上的坑。把这几条规则记下来,绝大多数「cron 不听话」的问题都能当场对上号。
1四个高频根因,一次对完
对照现象找原因,比逐字段死磕快得多。
| 现象 | 根因 | 正确写法 |
|---|---|---|
| 每月 1 号和每周一都跑,只想要其一 | 日字段与星期字段同时限定是「或」语义 | 一个字段留星号,在脚本里再过滤 |
| 任务整天在跑 | 把 6 段 Quartz 表达式贴进了 crontab | 去掉最前面的秒字段,改成 5 段 |
| 周日不执行,或表达式直接报错 | 周日写法搞混:crontab 里 0 和 7 都可,Quartz 里周日是 1 | 改用 SUN / MON 这类英文缩写 |
| 每年两次异常,凌晨任务跳过或重复 | 夏令时拨快时段不存在、拨回时段重复 | 把凌晨 2 到 3 点的任务挪到其他时段 |
把表达式读成「下一批执行时间」,比逐字段翻译更快发现问题——顺手看一眼下一跑时间对不对,多数错都能当场暴露。
2字段范围与常见误读
各字段的取值范围和步长写法,是另一半错误的来源。
- 分钟与小时
- 0 到 59、0 到 23,24 小时制没有 AM/PM。写 0 12 是中午,0 0 才是午夜。
- 步长
- 星号斜杠 15 表示第 0、15、30、45 分钟执行,不含第 60 分钟;范围不能整除时按起点顺延。
- 月份与星期
- 月份 1 到 12,也可写 JAN 到 DEC;星期在 crontab 里 0 到 7,0 与 7 都是周日。
- 常用缩写
- @daily 等于 0 0 星号 星号 星号,@hourly、@weekly、@monthly、@yearly 同理,但它们不可移植到 Quartz。
- Quartz 独有符号
- L 表示最后一天、W 表示最近的工作日、井号表示第几个星期几,这些在标准 cron 里是非法字符。
3写完怎么验证
不要靠肉眼通读,用工具把「下一次执行时间」列出来看。
- 先用表达式解析工具把 5 到 10 次执行时间列出来,确认它们符合预期,而不是只看字段含义。
- 用反向解析检查现有表达式:把生产环境里的表达式贴进去,看它被读成什么意思。
- 涉及星期与日期组合的场景,务必确认平台是 crontab 还是 Quartz,两者的语义不同。
- 部署前确认调度器的时区:系统 cron 用本机时区,很多云平台默认 UTC,差 8 小时就会全线偏。
- 上线后盯第一个执行周期,确认时区和夏令时切换当天没有异常。
顺着这个问题往下用
全部工具总览 →相关疑问
为什么 0 0 1 星号 1 会跑两次?
因为它读作「每月 1 号,或者每周一」,两个条件满足任意一个就执行,所以月初那天若恰好是周一也只算一次,但平常的周一和每月 1 号都会各跑一次。想要「既是 1 号又是周一」,得把星期留成星号再在脚本里判断日期。
0 和 7 到底哪个是周日?
在标准 crontab 里两个都表示周日,这是历史遗留的双写法,随便用哪个都行。但 Quartz 的星期是 1 到 7 且周日等于 1,写 0 或 7 会直接非法,跨平台建议用 SUN 这类英文缩写。
每 15 分钟为什么没有第 60 分钟?
因为分钟字段的有效范围是 0 到 59,步长在范围内取到 45 就到头了,下一次是下一小时的 0 分。这不是漏跑,是取值范围的边界。
夏令时那天任务会不会漏?
拨快的那天,被跳过的那一个小时里的任务不会执行;拨回的那天同一时刻会执行两次。所以凌晨 2 点到 3 点这个窗口尽量避开,或者让脚本自身做成幂等,重复执行也不会出错。
继续看:相关问题与资料
全部问题解答 →内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-09。若发现错误,欢迎通过页脚反馈入口告知。
速查在线工具箱