什么是 Cron 表达式?
Cron 表达式是一个紧凑的五字段时间串,告诉类 Unix 调度器(cron、cronie、systemd timer 的 cron 语法模式、Spring Scheduler、Quartz 标准模式、GitHub Actions schedule、Kubernetes CronJob)何时运行任务。它长这样:
*/15 9-17 * * 1-5
五个字段,空白分隔。每个字段对时间的某个单位加一条约束,五个约束在同一时刻全部满足时,表达式就匹配一次触发。
五个字段
从左到右:
| # | 字段 | 允许值 | 特殊字符 |
|---|---|---|---|
| 1 | 分钟 | 0-59 | * , - / |
| 2 | 小时 | 0-23 | * , - / |
| 3 | 日 | 1-31 | * , - / ? L W |
| 4 | 月 | 1-12(或 JAN-DEC) | * , - / |
| 5 | 星期几 | 0-7(0 和 7 都代表周日,或 SUN-SAT) | * , - / ? L # |
* 表示"所有值"——每一分钟、每一小时、每一天。
*/15 9-17 * * 1-5 到底意味着什么
逐项读:
*/15— 在第 0、15、30、45 分钟触发(从 0 起每 15 分钟)。9-17— 9 点到 17 点(含)。* *— 任意日、任意月。1-5— 周一到周五。
合起来:周一到周五的 09:00、09:15、09:30、09:45、10:00 …… 17:45。
三个最常见的特殊字符
,— 列表。1,15,45是第 1、15、45 分钟。-— 范围。9-17是 9 点到 17 点(含)。/— 步长。*/15是"每 15",可与范围配对,如1-30/5是"1 到 30 之间每 5"。
星期字段那个坑
POSIX cron 中,0 和 7 都代表周日。大多数现代实现也接受英文星期名(SUN、MON 等),但具体扩展语法因实现而异。Quartz 和 Spring 额外支持 L(last)、W(weekday)、#(nth),标准 cron 没有。若你的计划要跨系统跑得通,请只使用五字段 POSIX 方言。
日 AND 星期
当日字段和星期字段都是非 * 时,cron 视为 OR,不是 AND。所以 0 0 1 * 1 是"每月 1 日 OR 任意周一"的凌晨零点,不是"每月第一个周一"。要表达"每月第一个周一"需要 Quartz 的 # 扩展(0 0 * * 1#1)。
工具
想要一个浏览器内的 cron 编辑器:列出最近 5 次触发时间、校验每个字段,看本站的 Cron Generator。完全在客户端跑,无需注册。
想了解整个站上"时间、调度、日期计算"主题,看 Time and Cron hub。
另见
- ISO 8601 词条 — 与 cron 天然搭配的规范化日期时间格式
- C2PA Content Credentials — 完全无关,但是处理签名媒体时会碰到的术语
- Cron 速查表 — 常见调度模式手册