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 表达式解析器的使用方法

  1. 输入 Cron 表达式 以空格分隔填入「分 时 日 月 星期」五项。字段数或取值范围不符便会报错。
  2. 按下「解析」 会以文字显示该排程的含义。请先在此确认是否把自己的表达式读错了。
  3. 确认字段的明细 会逐一列出分、时、日、月、星期各自所指。可据以发现是否有不该填值的字段被填了值。
  4. 查看下次的执行预定 会以日期时间给出自当前时刻起的5次。诸如指定「每月31日」这类在某些月份并不存在的日期,其与本意的落差会以具体日期呈现。
  5. 照抄常见的模式 表中汇总了每分钟、每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规范用0表示星期日,但部分实现(如Vixie cron)也接受7作为星期日的另一种写法。本工具会将两者都解释为星期日。

不是优先关系,而是"或"条件。当日期字段和星期字段都被限制为非"*"时,只要满足其中一个条件的日子就会执行;如果只有一个字段被限制,则只以该字段为准。

基本的5字段格式(分 时 日 月 星期)是相同的。但GitHub Actions的定时任务始终按协调世界时(UTC)计算,并且实际执行可能会延迟几分钟到几十分钟,这与服务器上的crontab有所不同。

可以,分、时、日、月、星期这5个字段都可以使用步长语法(起始值/间隔,或*/间隔)。不过对于星期、月份这类取值范围较小的字段,实际能组合出的模式比较有限。
工具君

闲话 ― cron的半个世纪

cron这个名字据说源自希腊语中意为"时间"的Chronos(克罗诺斯),自20世纪70年代UNIX诞生之初就作为经典的任务调度工具存在。仅用5个字段就能表达从"每分钟"到"每年某个特定日期"的调度规则,这种简洁的语法即便在近半个世纪后的今天依然被广泛使用。

如今,这种5字段的cron语法不仅用于Linux服务器的crontab,也被GitHub Actions、GitLab CI、Kubernetes的CronJob等众多CI/CD工具和容器平台直接采用为定时任务的配置方式。一种诞生于UNIX时代的语法,至今仍在云原生环境中原封不动地被使用,这本身就是一件有趣的事。

cron语法中最容易让人困惑的一点,就是同时指定日期和星期时的行为。人们往往直觉认为这是"且"的关系(同时满足两者),但实际规范却是"或"的关系(满足其中之一即可),这也是任务执行频率与预期不符的常见原因之一。