* , - /、月份 JAN-DEC、星期 SUN-SAT、?。
Quartz / Spring 额外支持:L(当月最后一天,L-3 倒数第 3 天)、LW(最后一个工作日)、15W(离 15 号最近的工作日)、6L(当月最后一个周五)、6#3(当月第 3 个周五);Quartz 还支持年份段。
注意两处方言差异:① 星期数字——Linux / Spring 中 0 或 7 是周日、1 是周一;Quartz 中 1 是周日、7 是周六(建议直接写 MON-FRI 这样的英文缩写避免混淆)。② 日和周同时限定时——Linux 按"或"匹配,Spring 按"且"匹配,Quartz 要求其中一个写 ?。
自动识别:5 段按 Linux,7 段按 Quartz,6 段按 Spring / 带秒的 Linux(星期 0-7);6 段的 Quartz 表达式请手动选 Quartz。全部本地计算,不上传。
输入一条 crontab 表达式,得到:
*/15 9-18 * * 1-5 翻译成"工作日 9 到 18 点内每 15 分钟执行"。0 0 30 2 *)会明确说明。改表达式、起始时间或次数都实时更新。全部在浏览器本地计算,不上传。
| 方言 | 段数 | 字段顺序 | 星期编号 |
|---|---|---|---|
| Linux crontab | 5 段(或前置秒的 6 段) | [秒] 分 时 日 月 周 | 0 或 7 = 周日,1 = 周一 … 6 = 周六 |
| Spring | 6 段 | 秒 分 时 日 月 周 | 同 Linux(0 或 7 = 周日) |
| Quartz | 6 段或 7 段 | 秒 分 时 日 月 周 [年] | 1 = 周日 … 7 = 周六 |
| 字段 | 取值 | 说明 |
|---|---|---|
| 秒 | 0–59 | 6 / 7 段表达式的第 1 段 |
| 分 | 0–59 | |
| 时 | 0–23 | |
| 日 | 1–31 | |
| 月 | 1–12 或 JAN–DEC | |
| 周 | 见上表,或 SUN–SAT | |
| 年(仅 Quartz) | 1970–2199 | 第 7 段,可省略 |
通用特殊字符:*(全部)、,(列表)、-(范围,支持 FRI-MON 跨界)、/(步进,如 */15、0-30/10、5/20)、?(不指定,等同 *)。
Quartz / Spring 额外支持:
| 写法 | 位置 | 含义 |
|---|---|---|
L |
日 | 当月最后一天 |
L-3 |
日 | 倒数第 4 天(最后一天往前 3 天) |
LW |
日 | 当月最后一个工作日(周一到周五) |
15W |
日 | 离 15 号最近的工作日(不会跨月) |
6L、FRIL |
周 | 当月最后一个周五(Quartz 下 6 = 周五) |
6#3、FRI#3 |
周 | 当月第 3 个周五 |
两处容易踩坑的差异:
0 0 10 ? * 6L 在 Quartz 里是"最后一个周五",在 Spring 里 6 是周六,就成了"最后一个周六"。为避免歧义,建议直接写 MON-FRI、FRIL 这样的英文缩写。0 0 1 * 1 表示"每月 1 号 或 每周一"(Vixie cron 行为);Spring 按"且"匹配;Quartz 则要求「日」和「周」其中一个必须写 ?,否则报错。自动识别规则:5 段按 Linux;7 段按 Quartz;6 段按 Spring / 带秒的 Linux(星期 0–7)。6 段的 Quartz 表达式(如 0 0 12 ? * MON-FRI)用了 ? 时两种理解都能解析,但星期数字的含义不同,请手动选「Quartz」。
L / W / # 会直接报错,而不是猜测(这些不属于 Linux cron)。C(日历)修饰符。Q:显示的时间是哪个时区? A:跟随"起始时间"输入框,也就是你电脑的本地时区。服务器如果用 UTC,请把起始时间按 UTC 填。
Q:*/5 从 0 还是从字段最小值开始?
A:从字段允许的最小值开始。分/时是 0,日/月是 1。所以 */2 的日是 1、3、5……不是 2、4、6。
Q:为什么第一条不是我填的起始时刻? A:"未来执行时间"指起始时刻之后的下一次触发,不含起始时刻本身。
Q:0 0 30 2 * 为什么没有结果?
A:2 月没有 30 号,这条表达式永不触发,工具会提示("未来 8 年内没有匹配的执行时间")而不是死循环。
Q:表达式会上传吗? A:不会。解析和计算都在你的浏览器里完成。