当前语言: 中文 切换为英文

cron 表达式解释器

粘贴 cron 表达式,即可获得清晰易懂的文字说明。支持标准 5 字段和带秒的 6 字段 cron 格式。

示例(点击试用)

  1. 在上方输入框中键入或粘贴 cron 表达式。
  2. 阅读下方出现的通俗文字说明。
  3. 点击任一示例,即可将其填入输入框并立即看到解析结果。
  4. 修复任何以红色显示的解析错误,反复调整直至说明符合预期。
它能做什么?

解释器接收标准 Unix cron 表达式(5 字段)或含秒的 Quartz 风格表达式(6 字段),并返回如「上午 09:00,周一至周五」这样的人类可读描述。支持常用运算符 — *、,、-、/ — 以及月份名(JAN-DEC)和星期名(SUN-SAT)。每次按键后结果都会刷新,便于快速迭代。

示例

一个常见的工作时段作业示例:

0 9 * * MON-FRI

解析结果:

上午 09:00,周一至周五

一个更具体的 6 字段 Quartz(含秒)表达式:

0 30 2 ? * MON

解析结果(每周一 02:30:00)。

cron 格式

┌───────── 分 (0 - 59)
│ ┌─────── 时 (0 - 23)
│ │ ┌───── 日 (1 - 31)
│ │ │ ┌─── 月 (1 - 12,或 JAN-DEC)
│ │ │ │ ┌─ 星期 (0 - 6,或 SUN-SAT;0 和 7 都表示周日)
│ │ │ │ │
* * * * *

为什么 cron "0 0 * * *" 在 UTC 午夜触发,而不是我本地时间?

现实中的 cron 问题大多源于以下几个常见陷阱:

  • 时区漂移。 0 0 * * * 会按调度器的时区在午夜触发。在 Kubernetes CronJob 和 GitHub Actions 中默认是 UTC —— 请设置 spec.timeZone,或自行把小时转换为 UTC。
  • 5 字段与 6 字段混淆。 把 0 0 9 * * MON-FRI(6 字段)粘贴到 5 字段调度器会把前导 0 视作分,第二个 0 视作时,于是作业在午夜而非 09:00 触发。
  • 同时指定日(day-of-month)和星期(day-of-week)。 0 0 15 * MON 会在每月 15 日和每个周一都执行 —— 并不只在 15 日恰好是周一那天执行。这是 Vixie cron 的 OR 语义。
  • step 不会随发布重置。 */10 * * * * 按时钟在 :00、:10、:20、:30、:40、:50 触发 —— 并不是从你上次发布之后过十分钟。
  • 在标准 cron 中使用 ?。 ? 占位符是 Quartz 扩展。Unix cron 不接受它,请改用 *。
  • 星期的 0 与 7。 在经典 cron 中两者都表示周日,但一些解析器(旧 BSD)只接受 0。若注重可移植性,请使用 SUN。

运算符

  • * — 任意值
  • , — 值列表(例如 MON,WED,FRI)
  • - — 范围(例如 1-5)
  • / — step 值(例如 */15 = 每 15)
常见问题

5 字段与 6 字段 cron 有何区别?

标准 POSIX cron 有 5 个字段:分、时、日、月、星期。6 字段变体在最前加入秒字段,由 Quartz、Spring @Scheduled 及许多 Node cron 库使用。6 字段如 "0 0 9 * * MON-FRI" 在工作日 9:00:00 触发,而 5 字段 "0 9 * * MON-FRI" 在 9:00 触发。

它支持 Quartz 扩展(如 L、W、#)吗?

本解释器支持常用的 Unix / Vixie cron 方言,外加可选的前导秒字段。仅 Quartz 有的记号(表示最后的 L、最近工作日的 W、第 n 个星期几的 #,以及占位符 ?)并非标准 cron 一部分,不保证解析。如果依赖这些,请以具体调度器的文档来验证表达式。

为什么 0 0 * * * 的触发时间和我预期不一致?

cron 表达式本身没有时区概念。作业按运行调度器所在机器或容器的时区在午夜执行。Kubernetes CronJob、GitHub Actions、AWS EventBridge 默认都是 UTC。如果希望按本地午夜触发,请显式设置调度器时区(CronJob 的 spec.timeZone、TZ 环境变量、cron.yaml 的 timezone 键等)。

能否同时指定日和星期?

在标准 Vixie cron 中,如果日和星期都被限制了,任一匹配即触发 —— 是 OR,不是 AND。所以 "0 0 15 * MON" 会在每月 15 日和每个周一都运行。Quartz 反其道而行,要求其中一个字段必须为 "?" 以避免歧义。

step 值是如何工作的?

step 使用 range/step 语法。"*/15 * * * *" 从 :00 起每 15 分钟触发一次。分字段里的 "10-50/20" 在 :10、:30、:50 触发。step 并不是「从现在起每 N 分钟」—— 边界始终对齐到范围起点,因此 step 不会随当前时间漂移。

你们会保存我在这里测试的 cron 表达式吗?

不会。我们不保留你键入表达式的任何记录。无论粘贴还是试验,关闭或刷新页面后都会丢弃 —— 没有日志,也没有关于你所处理排程的分析。如需额外确认,可查看浏览器的开发者工具。