CRON 表达式解析器

输入 5 字段 cron 表达式,实时生成中文执行描述、计算未来 5 次执行时间。支持 * ? , - / L W # 全部特殊字符,内置 12 个常用预设。 适用于配置 crontab、Kubernetes CronJob、systemd timer、Airflow DAG 等定时任务场景。 所有解析在浏览器本地完成。

0分钟 (0-59)
9小时 (0-23)
*日 (1-31)
*月 (1-12)
1-5周 (0-6)
执行含义
在第 0 分钟、9 时、每周一、周二、周三、周四、周五
常用预设
字段语法说明
字段取值范围说明
分钟0-59每小时的第几分钟执行
小时0-23每天的第几小时执行(24 小时制)
1-31每月的第几号执行(L 表示月末)
1-12每年的第几月执行(支持 JAN-DEC)
0-6每周的第几天执行(0=周日,支持 SUN-SAT)
特殊字符
字符含义示例
*任意值* * * * * 每分钟
?不指定(同 *,仅日 / 周)0 0 ? * 1 每周一
,列表0 0,12 * * * 每天 0 与 12 点
-范围0 9 * * 1-5 工作日 9 点
/步长*/5 * * * * 每 5 分钟
L最后0 0 L * * 月末 0 点
W最近工作日0 0 15W * * 最接近 15 号的工作日
#第几周0 0 * * 5#3 第 3 个周五
支持标准 5 字段 cron 语法与 L/W/# 扩展字符。所有解析在浏览器本地完成,下次执行时间按本地时区计算。

常见问题

CRON 表达式是什么?5 个字段分别表示什么?

CRON 表达式是一种用于描述定时任务执行时间的字符串格式,起源于 Unix cron 守护进程。标准格式由 5 个字段组成,用空格分隔:

分钟  小时  日  月  周
0    9    *   *   1-5
  • 分钟(0-59):每小时的第几分钟执行
  • 小时(0-23):每天的第几小时执行(24 小时制)
  • (1-31):每月的第几号执行
  • (1-12):每年的第几月执行(也支持 JAN-DEC 缩写)
  • (0-6):每周的第几天执行(0=周日,也支持 SUN-SAT 缩写)

例如 0 9 * * 1-5 表示「每个工作日(周一到周五)上午 9 点 0 分」执行。

*? 有什么区别?

* 表示「任意值」,即该字段不做限制。例如 * * * * * 表示每分钟执行(5 个字段都为任意)。

? 表示「不指定」,语义上与 * 等价,但仅用于 两个字段。它的存在是为了消除歧义:当你只想用「周」 字段而不管「日」时,写 ? 比写 * 更明确。

例如 0 0 ? * 1 表示「每周一 0 点」,? 表示「日字段不参与判断」。 本工具中 ?* 行为一致。

L / W / # 特殊字符是什么意思?

这三个是 cron 的常见扩展字符(非 POSIX 标准,但被大多数现代 cron 实现支持):

  • L(Last,最后):用于日或周字段。 0 0 L * * 表示「每月最后一天 0 点」; 0 0 * * 5L 表示「每月最后一个周五 0 点」。
  • W(Weekday,最近工作日):仅用于日字段。 0 0 15W * * 表示「最接近 15 号的工作日 0 点」—— 若 15 号是周六,则提前到周五 14 号;若是周日,则顺延到周一 16 号。
  • #(第几周):仅用于周字段,格式为 周几#第几0 0 * * 5#3 表示「每月第 3 个周五 0 点」。

这些字符在 Kubernetes CronJob、Quartz Scheduler、Spring Scheduler 中都受支持。

标准 cron(POSIX)和 Quartz cron 有什么区别?

主要区别在字段数量与周几编号:

  • POSIX cron(Linux crontab):5 字段,周几 0-6(0=周日), 不支持秒。本工具采用此格式。
  • Quartz Scheduler:6-7 字段,最前面多一个「秒」字段(0-59), 最后可选「年」字段。周几 1-7(1=周日)。支持 L W # 等扩展字符。
  • Spring @Scheduled:6 字段(含秒),周几 0-6(0=周日)。

迁移时注意:把 Quartz 的 6 字段表达式去掉第一个「秒」字段,即可用于本工具与 POSIX cron。

为什么 0 0 31 2 *(2 月 31 日)不会执行?

cron 不会校验「日」字段是否在该月真实存在。2 月最多只有 28 或 29 天, 没有 31 号,所以 0 0 31 2 * 永远不会触发——但 cron 解析器不会报错, 只是静默不执行。

类似的陷阱还有 0 0 30 2 *(2 月 30 日)、0 0 31 4,6,9,11 * (4/6/9/11 月 31 日)。若想表达「月末」,应该用 0 0 L * *(L 字符), 它会自动适配每月的实际天数(28/29/30/31)。

CRON 的时区怎么处理?夏令时会有什么问题?

POSIX cron 默认使用服务器本地时区。容器化部署时,Docker / Kubernetes 默认 UTC,需在 Dockerfile 设置 TZ=Asia/Shanghai 或在 deployment.yaml 注入 TZ 环境变量。

夏令时(DST)是 cron 的著名陷阱:在实行夏令时的地区(如欧美), 春季「拨快 1 小时」会跳过凌晨 2:00-3:00,秋季「拨慢 1 小时」会重复凌晨 1:00-2:00。 若 cron 表达式恰好落在此时段,可能跳过执行重复执行。 Kubernetes CronJob 文档专门警告了这个问题。

本工具按浏览器本地时区计算下次执行时间。生产环境部署时请以服务器时区为准。

日字段和周字段同时指定时,是 AND 还是 OR?

这是 cron 最容易踩坑的语义之一。POSIX 标准规定:

  • 中至少一个为 *? 时, 取 AND(两者都必须匹配)。
  • 被显式指定(都不是 */?)时, 取 OR(任一匹配即执行)。

例如 0 0 1 * 1 表示「每月 1 号 每周一 0 点」(OR), 而不是「每月 1 号且是周一」(AND)。本工具遵循此标准。

若想表达「每月 1 号且是周一」,需要写成两条 cron 表达式,或在代码层判断 date.getDate() === 1 && date.getDay() === 1

数据会上传到服务器吗?

不会。本工具完全在浏览器内运行,所有 cron 解析、描述生成、下次执行时间计算都在本地完成, 不会上传到任何服务器,也不会被记录。适合在配置生产环境定时任务前做语法校验。