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分钟执行一次。 |
使用小贴士
- 像"*/15 9-17 * * 1-5"这样,逗号列表、连字符范围与斜杠步长可以自由组合使用。
- 星期字段通常是0-6(星期日至星期六),但本工具也接受部分cron实现使用的7作为星期日的别名。
- 如果日期字段和星期字段都被限制为非"*",按照标准cron规范,两者是"或"的关系——只要满足其中一个条件就会执行。
- GitHub Actions的schedule触发器使用与本工具相同的5字段cron语法,因此也可以用来确认工作流的执行时间。
- 实际执行时间会受服务器时区设置影响,修改crontab后,建议同时确认一下服务器的当前时间。
常见问题
是的。标准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语法中最容易让人困惑的一点,就是同时指定日期和星期时的行为。人们往往直觉认为这是"且"的关系(同时满足两者),但实际规范却是"或"的关系(满足其中之一即可),这也是任务执行频率与预期不符的常见原因之一。