如何阅读 Cron 表达式
经典的 Unix Cron 表达式由空格分隔的五个字段组成:分钟(0–59)、小时(0–23)、日(1–31)、月(1–12)和星期(0–6,其中 0 和 7 都表示星期日)。当前时间与所有字段都匹配时任务就会运行。星号表示“任意值”,所以 * * * * * 表示每分钟运行一次。
在一个字段内可以组合多个值:逗号表示列表(1,15),连字符表示范围(9-17),斜杠表示步长(*/10 表示每隔 10 个单位)。大多数实现也接受 JAN、MON 这样的月份和星期英文缩写。
为什么方言很重要
并不是所有调度器都使用同一种 Cron。Quartz 和 Spring 在最前面增加了秒字段,AWS EventBridge 在最后增加了年字段,而且 Quartz 和 AWS 的星期从 1 = 星期日开始编号,而不是 0。Quartz 和 AWS 还要求“日”或“星期”字段之一必须为问号。CronExplain 会根据表达式的结构自动识别方言,你也可以随时手动切换。
下次运行时间与时区
运行时间列表按你所选时区的本地挂钟时间计算,并在旁边显示对应的本地时间。夏令时的处理方式与大多数调度器一致:时钟拨快时被跳过的时间当天不会运行,时钟拨回时重复出现的时间只运行一次。GitHub Actions 和 AWS EventBridge 规则始终使用 UTC,因此在这两种方言下工具会自动切换到 UTC。
可视化生成表达式
如果你更喜欢点选而不是手写,可以使用可视化生成器:为每个字段选择“每个”“每隔 N”或指定值,然后复制结果。预设覆盖了最常见的调度,从每 5 分钟到每月第一天都有;每个结果都可以通过链接分享,表达式会保存在 URL 中。
常见问题
- */5 * * * * 是什么意思?
- 表示每 5 分钟运行一次:每天每小时的第 0、5、10 分钟……依此类推。*/5 从该字段的最小值(0)开始,每次加 5。
- Cron 中星期日是 0 还是 7?
- 在标准 crontab、Kubernetes、GitHub Actions 和 Spring 中,0 和 7 都表示星期日。在 Quartz 和 AWS EventBridge 中,一周从 1 = 星期日到 7 = 星期六,因此 0 是无效值。
- 同时设置“日”和“星期”会怎样?
- 标准 Cron 只要其中一个字段匹配就会运行,所以 0 0 13 * 5 会在每月 13 日以及每个星期五运行。Quartz 和 AWS 不允许同时设置,所以其中一个必须是“?”。
- Cron 使用哪个时区?
- crontab 使用服务器本地时区;Kubernetes 默认使用控制器所在时区,除非设置了 spec.timeZone;GitHub Actions 和 EventBridge 规则使用 UTC。在工具中选择时区即可查看准确的运行时间。
- 我的表达式会被发送到服务器吗?
- 不会。解析、文字说明和运行时间计算都在你的浏览器中完成,你输入的内容不会离开你的设备。