SomeeLab.tools

Cron 表达式解析

把 cron 表达式拆成五个字段逐一说明,并算出接下来几次的执行时刻。支持五字段标准写法和 @daily 之类的简写。无需注册,在浏览器中算完。

分钟
0
小时
9
日期
全部
月份
全部
星期
周一-周五

五个字段的顺序

从左到右依次是分钟、小时、日期、月份、星期。0 9 * * 1的意思是分钟为 0、小时为 9、日期和月份都不限、星期为周一,也就是每周一早上九点执行。

星号表示这个字段没有限制。越靠前的字段写成星号,任务跑得越频繁,* * * * *就是每分钟一次。要是不小心把分钟字段写成星号,一天会跑 1440 次。

符号怎么读

  • 1-5是从 1 到 5 的连续取值。
  • 1,3,5只取这三个值。
  • */15从 0 开始每隔 15 取一次。放在分钟字段就是 0、15、30、45。
  • 9-17/2只在给定范围内跳着取。
  • 星期和月份也能写名字,比如MON-FRIJAN,JUL

星期字段里 0 是周日,6 是周六。多数实现也接受 7 表示周日,所以07指的是同一天。

同时写日期和星期时

这是最容易搞错的地方。第三个字段(日期)和第五个字段(星期)都给了值时,cron 不是在两个条件同时满足的日子执行,而是任意一个对上就执行。

0 0 1 * MON不是“每月一号且恰好是周一”,而是“每月一号,或者每个周一”,一个月大概会跑五次。只限定其中一个、另一个留成星号,就能避开这个坑。

先确认时区

这里显示的下次执行时刻,按你当前设备的时区计算。服务器上的 cron 走服务器自己的时区,所以部署之前先确认那台机器是什么设置。保持 UTC 的服务器很常见,本想让任务在早上九点跑,结果落到了下午。

在有夏令时的地区,调表那天落在被拨动那一小时的任务可能被跳过,也可能跑两遍。把任务从凌晨两点前后挪开就能绕过这个问题。

六个字段是另一套写法

有些表达式最前面多一个秒字段,一共六个。那是 Spring 和 Quartz 的写法,和标准 crontab 不是一回事。这个工具只读五个字段。

把六字段的式子直接塞进 crontab,每个字段都会错位一格:本来当秒写的值被当成分钟,分钟被当成小时,于是在完全不对的时间执行。复制之前先弄清目标用的是哪一套语法。