Cron 表达式转文字

全球通用工具

cron 表达式是一种用五个字段写成的排期:分、时、月内日期、月、星期几,字段里是数字、范围、列表和星号。它紧凑而精确,所以从 Linux crontab 到云任务运行器都要求你写它——也正因为如此,这类行在下午三点看起来一目了然,在凌晨三点夜间任务迟到时却完全看不懂。本页用大白话逐字段说明排期,绝不把读法留给你的算术。

标准 cron 用五个字段(分、时、月内日期、月、星期几);六字段形式把秒放在最前面。Quartz 方言读取前六个字段,并处理名字和额外常量。

三种方言(Vixie 兼容、秒在前的六字段、Quartz)对星期日的计数不同、字段顺序不同、接受的特别字符也不同。先选再粘贴,否则会收到一段解释形状的拒绝信息。

留空则文件名为 “cron-description.txt”。

边输入边更新。所有计算都在你的浏览器里完成,数据不会离开本机。

大白话

在 09:00,周一至周五

按 Vixie 五字段方言读取——表达式为 “0 9 * * 1-5”。

每天触发
1
每周触发
5
读取字段数
5

逐字段

字段写法含义选中的数值
分钟0:0000
小时90909
月内日期*每天
月份*每月
星期几1-5周一至周五周一、周二、周三、周四、周五

“写法”列是字段输入时的原样(只规范了空白);“含义”列是它要求的内容。在 Vixie 兼容 cron 里,当月内日期与星期几都被限定时,只要匹配其中一个就算匹配——这条经典规则很少有人记得。

这份排期没有说明的

  • 这种方言把星期日算作 0,也接受用 7 表示它,所以 1 是星期一。Quartz 把星期日算作 1,同一个表达式在那里会指向另一天。
表达式在当前浏览器标签页里读取,说明也在这里写成:没有上传、没有发送、也没有存储任何内容。

它还处理真正容易绊倒人的地方:cron 不是只有一种方言。Vixie 兼容形式把星期日算作 0;六字段形式在最前面加秒;Quartz 读取不同的字段顺序,把星期日算作 1,并接受名字和额外常量。同样的数字可能在一种方言里合法,在另一种里被拒绝,所以你要在粘贴前先选方言;拒绝信息会指出哪个字段错了,而不是耸耸肩说一句“无效”。

关于这个工具

这是与 cron expression generator 页面上“预览排期”那套机制相同的解释部分:同一套读取规则、同一套字段规则、同一段拒绝文字。什么都不会被发送到别处,也不会真的安排任何任务——描述是在标签页里根据表达式算出来的,你可以复制它,或下载成人们真正会贴进 wiki 或运维手册的文本。

可以用它在 crontab 上线前做一次理智检查,把同事五字段的草稿变成审阅者能读的东西,或者向最终要在凌晨两点调试它的人解释一个 Quartz 触发器。它是读取器,不是写入器:如果你想按星期几和时间选项来构造表达式,隔壁标签页的 cron expression generator 才是那台工具。

它是怎么工作的

五个字段、六个字段,以及每个字段数的是什么

标准形式是五个字段:分(0-59)、时(0-23)、月内日期(1-31)、月(1-12)、星期几(Vixie 兼容 cron 中为 0-7,0 和 7 都表示星期日)。一个字段可以是单个值、列表(1,3,5)、范围(9-17)、步长(*/15),或在方言允许时使用名字;本页会把它们全部展开成文字:“在第 0 分钟、第 9 小时,每个月的每一天,星期一到星期五”。

有两种形式会在最前面增加秒字段,用于需要亚分钟级精度的任务;Quartz 则把顺序转过来——秒、分、时、月内日期、月、星期几——把星期日算作 1,并接受 `MON` 这样的名字和 `L`、`W` 这样的常量。你指的是哪种形式,会改变看似相同数字的含义,所以方言是表单上的一个选择,结果也会写明是哪一种方言读取的。

除了一句摘要之外还显示什么

标题是排期的大白话,页面其余部分用来核对这个读法。逐字段表格会列出每个字段的原样写法和实际含义,所以星期字段里的 `1-5` 会被写成“星期一到星期五”,而不是停留在数字。计数优先回答运维问题:任务一天触发几次、一周几次、实际读取了几个字段。

宏也会被处理——`@daily`、`@hourly` 等等会在显示读法之前展开成它们代表的表达式。当表达式无法解析时,页面会点名失败原因:哪个字段、为什么该值超出所选方言的识别范围,以及它是按哪种方言读取的——因为在一个方言里无效的表达式,在另一个方言里往往完全合法。

描述不会告诉你的三件事

一行 cron 只说什么时候触发,另有三件事它一个字都不说,而这三件事决定了任务到底跑不跑。第一是时区:表达式按守护进程所在的时区读,所以同一行在两台服务器上会在两个不同的本地时间触发;写给 09:00 的那一行会跟着该时区过夏令时——换时那天它在 08:00 或 10:00 跑过一次,是正确行为,不是漂移。

第二是漏跑。调度器不会补课:到了该跑的时刻机器关着,这一次就被跳过而不是排队;本页描述的是「打算怎么跑」,不是「实际跑过什么」。第三是重叠:五个字段里没有任何一个能阻止上一份还在跑时再起一份,间隔短于任务耗时,就等于允许两份同时在跑。

这些都不在表达式里,这正是「上线前把它读出来」的理由:描述给你节奏,这三个问题告诉你系统能不能扛住这个节奏。「每十五分钟一次」和「一个四分钟跑完的任务」是两句不同的话,而表达式里只有其中一句。

示例

示例使用页面自带的默认输入,只改设置;下面的结果与你在页面上看到的完全一致。

经典工作日排期

Cron 表达式: 0 9 * * 1-5 · 方言: 5 字段——Linux、macOS、GitHub Actions(分 时 日 月 周)

大白话

在 09:00,周一至周五

按 Vixie 五字段方言读取——表达式为 “0 9 * * 1-5”。

每天触发: 1 · 每周触发: 5 · 读取字段数: 5

读作“上午 09:00,星期一到星期五”——一天一次,一周五天,对月和月内日期都没有限制。

维护窗口,Quartz 风格

Cron 表达式: 0 0 2 ? * 2-6 · 方言: Quartz——Java 调度器,六字段或七字段(支持 ? L W # 与可选年)

大白话

在 02:00,周一至周五

按 Quartz方言读取——表达式为 “0 0 2 ? * 2-6”。

每天触发: 1 · 每周触发: 5 · 读取字段数: 6

六个字段按 Quartz 顺序读取,星期字段在第六位,星期日算作 1,所以 2-6 是星期一到星期五。

常见问题

我的表达式会被上传到什么地方吗?

不会。表达式由这个标签页里的 JavaScript 解析,描述根据解析结果生成;页面背后没有请求,下载也是本地生成的 blob。一行 cron 可能携带内部任务的细节,所以本页从不接触服务器,输入也不会上传到任何服务器。注意:本工具的输入内容(表达式)可能会保留在网页地址中,分享链接前请注意隐私。

为什么同一个表达式在另一个工具里读法不同?

因为 cron 有方言。Vixie 兼容 cron 把星期日算作 0;六字段形式在最前面加秒;Quartz 把星期日算作 1,按不同顺序读取字段,并接受不同的特殊字符。默认方言不同的两个工具,会用不同方式描述同样的数字,而两者都可能是对的——这就是这里把方言做成选择、并让结果写明所用方言的原因。还有两个边界要知道:`@daily` 这类宏会先展开成五字段,如果你选了六字段或 Quartz 方言,它就会因字段数不符而被拒绝;把 `?` 放进五字段 cron 时,页面只会报字段数不符或“这是 Quartz 语法”,不会替你移动它。

星期字段里的 0 和 7 都表示什么?

在 Vixie 兼容 cron 里,0 是星期日,7 也被接受为星期日,所以 0-7 覆盖一整周,而 1-5 是星期一到星期五。Quartz 则用 1-7 编号,1 是星期日,并且在月之后读取星期字段,而不是之前。逐字段表格就是为了让这一点可见,而不是让它停留在脚注里。Quartz 本来要求两个日期字段里有一个写 `?`,但本页的 Quartz 读取器在两个字段都写 `*` 时会照常接受,并按“每天”解释——这是一个已知的宽松处。

`*/15` 这样的步长在说什么?

步长表示从其起始值开始的“每第 n 个单位”:分钟字段里的 `*/15` 是每 15 分钟(第 0、15、30、45 分钟),小时字段里的 `9-17/2` 是从 9 到 17 的每隔一小时。本页会在描述里把步长展开成实际列表,这样排期是按时间读的,而不是按语法读的。

如果我的表达式无效呢?

页面会拒绝它,但会给出理由而不是通用错误:点名失败的字段,解释为什么该值超出所选方言的识别范围,并显示本来可用的范围。在一个方言里被拒绝的表达式,在另一个方言里可能合法,所以拒绝是读法的一部分,而不是死路。有一处已知的粗糙:Quartz 的 `L-3` 偏移会被拒绝,但只报“L 在月内日期字段里不是可识别的名字”,并不会解释偏移语法;`L` 和 `LW` 则正常读取。

资料来源与统计口径

  • 说明遵循与表达式生成器相同的 cron 约定:五字段、星期日写作 0 或 7,也支持六字段与 Quartz。
  • `@daily` 这类宏会先展开成对应的五字段表达式,所以读出来的就是 crontab 会执行的内容。
  • 解读在浏览器里完成,不上传任何内容;输入也不会上传或存储。

最近复核于 2026-10-07.

本页在您的浏览器本地运行,请保留原文件备份;不涉及财务建议。 阅读完整免责声明。