Cron表达式解析器与下次执行时间计算
解析cron表达式(分 时 日 月 星期),用通俗语言展示调度规则,支持步长、范围、逗号列表等语法,并自动计算接下来5次执行时间。适合查看crontab或GitHub Actions的定时任务设置。
Cron表达式语法(5个字段)
cron表达式从左到右由5个用空格分隔的字段组成:分钟、小时、日期、月份、星期。每个字段可使用以下特殊字符。
| 位置 | 字段 | 允许范围 |
|---|---|---|
| 1 | 分钟 | 0-59 |
| 2 | 小时 | 0-23 |
| 3 | 日期(几号) | 1-31 |
| 4 | 月份 | 1-12 |
| 5 | 星期 | 0-7 |
星期字段通常0=星期日、6=星期六,但本工具也接受部分cron实现使用的7作为星期日的别名(内部按0处理)。
每个字段都可以使用"*"(任意值)、逗号分隔的列表(1,15,30)、连字符范围(1-5)以及斜杠步长(*/15、1-30/5),并且这些语法可以自由组合。
常见的cron模式
| cron表达式 | 含义 |
|---|---|
| * * * * * | 每分钟执行一次。 |
| */5 * * * * | 每5分钟执行一次。 |
| 0 * * * * | 每小时的第0分钟执行一次。 |
| 0 0 * * * | 每天0点0分(凌晨)执行。 |
| 0 9 * * 1-5 | 工作日(周一至周五)的9点执行。 |
| 0 0 1 * * | 每月1号0点0分执行。 |
| 0 0 1 1 * | 每年1月1日0点0分执行。 |
| */15 9-17 * * 1-5 | 工作日9点到17点之间,每15分钟执行一次。 |
什么是 Cron 表达式
Cron 表达式是把「反复执行的处理何时运行」以一行写出的记法。自左而右以空格分隔「分・时・日(日期)・月・星期」五个字段,各字段可组合 *(全部)、以逗号列举、以连字符表范围、以斜杠表间隔来指定。*/15 9-17 * * 1-5 即为「工作日9时至17时每15分钟」之意。
本工具会解析所输入的表达式,**先以文字说明该排程的含义,再算出自当前时刻起接下来将执行的5个日期时间**。各字段的明细亦并列显示,可确认是哪一部分在起作用。星期以0=周日〜6=周六为标准,但部分实现所用的7=周日写法本工具亦予接受,内部按0处理。下次执行的搜索范围约为4年,若其中没有匹配的日期时间,便会予以提示。
Cron 表达式解析器的使用方法
- 输入 Cron 表达式 以空格分隔填入「分 时 日 月 星期」五项。字段数或取值范围不符便会报错。
- 按下「解析」 会以文字显示该排程的含义。请先在此确认是否把自己的表达式读错了。
- 确认字段的明细 会逐一列出分、时、日、月、星期各自所指。可据以发现是否有不该填值的字段被填了值。
- 查看下次的执行预定 会以日期时间给出自当前时刻起的5次。诸如指定「每月31日」这类在某些月份并不存在的日期,其与本意的落差会以具体日期呈现。
- 照抄常见的模式 表中汇总了每分钟、每5分钟、每小时0分、工作日9时等常用模式。以最接近者为底加以改写是捷径。
用好本工具的小技巧
- 像"*/15 9-17 * * 1-5"这样,逗号列表、连字符范围与斜杠步长可以自由组合使用。
- 星期字段通常是0-6(星期日至星期六),但本工具也接受部分cron实现使用的7作为星期日的别名。
- 如果日期字段和星期字段都被限制为非"*",按照标准cron规范,两者是"或"的关系——只要满足其中一个条件就会执行。
- GitHub Actions的schedule触发器使用与本工具相同的5字段cron语法,因此也可以用来确认工作流的执行时间。
- 实际执行时间会受服务器时区设置影响,修改crontab后,建议同时确认一下服务器的当前时间。
Cron 表达式解析器的应用场景
写入 crontab 之前先确认含义
在登记到服务器之前先行解析,可避免「运行得比预想频繁」或「完全不运行」这类事故。
确认 GitHub Actions 的排程
写在工作流 schedule 中的表达式同样是这五字段的记法。可由下次执行的一览查看间隔是否合乎本意。
读懂他人所写的表达式
当接手的配置中出现 0 */6 * * * 这类表达式时,转为文字即可立刻明白它在几时运行。
排查执行时间偏差的原因
当「本该运行的时刻却没运行」时,查看下次执行的一览即可分辨原因究竟出在表达式本身,还是别的因素。
与 Cron 表达式相关的术语
- cron
- 指类 Unix 系统中于既定时刻反复执行处理的机制。记载执行内容与时刻对应关系的清单称为 crontab。
- 字段
- 指以空格分隔 Cron 表达式所得的各要素。自左而右为分(0〜59)、时(0〜23)、日(1〜31)、月(1〜12)、星期(0〜6)五项。
- 星号(*)
- 表示该字段所能取的全部值。置于分即为「每分钟」,置于月即为「每月」。
- 步长(/)
- 写作
*/15之类以指定间隔。如「每15分钟」那样,在范围之内按固定步幅跳选。 - 范围(-)
- 写作
1-5以一并指定连续的值。置于星期即为周一至周五,置于时即为1时至5时。 - 星期的编号
- 0为周日,6为周六。部分实现亦接受7作为周日,本工具同样把7视同0处理。
- 时区
- cron 通常以运行方所处环境的时刻来解释。若服务器的时刻设定与预想不同,同一表达式的执行时刻便会随之偏移。
常见问题
闲话 ― cron的半个世纪
cron这个名字据说源自希腊语中意为"时间"的Chronos(克罗诺斯),自20世纪70年代UNIX诞生之初就作为经典的任务调度工具存在。仅用5个字段就能表达从"每分钟"到"每年某个特定日期"的调度规则,这种简洁的语法即便在近半个世纪后的今天依然被广泛使用。
如今,这种5字段的cron语法不仅用于Linux服务器的crontab,也被GitHub Actions、GitLab CI、Kubernetes的CronJob等众多CI/CD工具和容器平台直接采用为定时任务的配置方式。一种诞生于UNIX时代的语法,至今仍在云原生环境中原封不动地被使用,这本身就是一件有趣的事。
cron语法中最容易让人困惑的一点,就是同时指定日期和星期时的行为。人们往往直觉认为这是"且"的关系(同时满足两者),但实际规范却是"或"的关系(满足其中之一即可),这也是任务执行频率与预期不符的常见原因之一。