Cron表达式生成器

可视化配置 改左侧,右侧实时生成
Linux crontab 为 5 位
常用预设(点击直接套用)
生成结果
未来 10 次执行时间
    左侧可视化配置即可生成 Cron 表达式,实时显示中文含义与未来 10 次执行时间;也可直接粘贴表达式反向解析,支持 5 段与 6 段(含秒)格式。

    什么是 Cron 表达式

    Cron 是 Unix / Linux 系统中用来描述「定时任务」的字符串,由 5 个(或 6 个)用空格分隔的字段组成,每个字段代表一个时间维度。系统守护进程 crond 每分钟检查一次,凡是匹配当前时间的表达式就执行对应的命令。

    本工具提供可视化生成*与*表达式解析两种用法:改左侧配置即可实时生成表达式,也可以直接在右侧编辑表达式,立刻看到中文含义与未来 10 次执行时间。


    字段含义

    标准 5 段格式(Linux crontab、大部分 Linux 发行版):

    位置字段取值范围允许的特殊字符
    1分钟0–59* , - /
    2小时0–23* , - /
    3日期1–31* , - /
    4月份1–12* , - /
    5星期0–6(0 和 7 都表示周日)* , - /

    6 段格式(在分钟前多一个「秒」字段)常见于 Quartz、Spring @Scheduled、部分 Java 任务框架。注意各家实现有差异:Quartz 还额外支持第 7 段「年」以及 ?、L、W、# 等扩展字符,本工具只覆盖通用的 * , - / 语法。


    特殊字符的含义

    字符含义示例说明
    *每一个 * * * 每个取值都匹配,即每分钟
    ,列举0 0,12 * 0 点和 12 点各执行一次
    -范围0 9 1-5周一到周五的 9 点
    /步长/5 * * * 每 5 分钟;0-30/10 表示 0 到 30 之间每 10 分钟

    / 可以与其他写法组合。*/5 等价于 0-59/5,表示从范围起点开始每隔 5 个单位取一个值——所以它匹配的是 0、5、10、…、55,而不是「从当前时间起每 5 分钟」。这一点在跨小时、跨天时容易产生误解。


    六个最容易踩的坑

    第一,日期与星期是「或」关系。* 当日期和星期**都不为** * 时,Linux cron 的判定是「满足任意一个即执行」,而不是「同时满足」。例如 0 0 1 * 1 的含义是「每月 1 号*或每个周一」的 0 点执行,而不是「每月 1 号且是周一」。想要「同时满足」,需要在脚本里自行判断。

    第二,星期 0 和 7 都表示周日。 有些实现只接受 0,有些两个都接受。为了可移植,建议统一使用 0。

    第三,cron 不认「每月最后一天」。 标准 cron 无法直接表达「每月 31 日」——因为 2 月、4 月没有 31 日,该月会被跳过而不是顺延到月末。需要月末执行时,通常在脚本里判断,或使用 L(仅部分实现支持)。

    第四,时区问题。* cron 按*服务器所在时区执行。如果服务器是 UTC 而你想按北京时间跑,表达式里的小时需要减 8。Docker 容器默认通常是 UTC,这是「定时任务提前/延后 8 小时」的最常见原因。

    第五,/N 的起点是 0 而不是当前时间。 /7 在分钟字段匹配 0、7、14、…、56,然后下一分钟是 0——所以最后一段间隔只有 4 分钟,不是均匀的 7 分钟。

    第六,环境变量不同。 cron 执行时的 PATH 与登录 shell 不同,脚本里用到 node、python、php 时建议写绝对路径,否则会出现「手动执行正常、定时执行报 command not found」。


    常见场景对照

    需求表达式
    每分钟 * * *
    每 5 分钟/5 * * *
    每小时整点0 * *
    每天 0 点0 0 *
    每天 9 点0 9 *
    每天 0 点与 12 点0 0,12 *
    工作日 9 点0 9 1-5
    每周一 9 点0 9 1
    每月 1 号 0 点0 0 1
    每季度首日0 0 1 1,4,7,10 *
    每年 1 月 1 日0 0 1 1 *
    每 30 秒(6 段)/30 * * * *

    Linux crontab 的快捷写法

    除了数字表达式,Linux crontab 还支持一批以 @ 开头的宏,写起来更直观(本工具不生成,但可以直接在 crontab 里使用):

    宏等价表达式
    @reboot开机时执行一次
    @yearly / @annually0 0 1 1 *
    @monthly0 0 1
    @weekly0 0 0
    @daily / @midnight0 0 *
    @hourly0 * *

    使用方式

    1. 在左侧选择每个字段的模式(每 / 间隔 / 指定 / 多个 / 范围 / 自定义),填写取值,右侧立即生成表达式;
    2. 勾选「包含秒」可切换到 6 段格式;
    3. 点击常用预设可一键套用典型配置;
    4. 也可以直接编辑右侧的表达式框,下方会同步给出中文描述与未来 10 次执行时间;
    5. 点击复制按钮可复制表达式,粘贴到 crontab、Jenkins、Quartz 配置或云函数的定时触发器中。

    提示:未来执行时间基于浏览器本地时区计算。部署到服务器时请确认服务器时区,避免出现时间偏差。

    常见问题 FAQ

    生成的表达式可以直接用在哪里?

    可用于 Linux crontab、Jenkins 定时构建、Quartz / Spring 的 @Scheduled、云函数定时触发器、Kubernetes CronJob 等。注意各平台对 6 段格式与扩展字符的支持有差异。

    @daily 这类写法支持吗?

    本工具不生成 @ 宏,但 Linux crontab 本身支持。@daily 等价于 0 0 * * *,@hourly 等价于 0 * * * *,@reboot 表示开机执行一次。

    表达式无效时会怎样?

    右侧会显示具体是哪一段字段出错以及原因(如取值超出范围、起始值大于结束值),此时不会覆盖上一次的有效表达式。

    未来执行时间是怎么算出来的?

    从当前时间开始逐日向后推演,先判断日期与月份是否匹配,再展开当天的时、分、秒组合,收集最近的 10 个时刻。基于浏览器本地时区计算。

    cron 能表达「每月最后一天」吗?

    标准 cron 不支持。写 0 0 31 * * 会让没有 31 号的月份(如 2 月、4 月)被跳过而不是顺延到月末。需要月末执行时应在脚本里判断日期。

    为什么定时任务执行时间和预期差了 8 小时?

    通常是时区问题。cron 按服务器时区执行,Docker 容器默认多为 UTC。请确认服务器时区,或调整表达式中的小时数。

    */5 是从当前时间开始算 5 分钟吗?

    不是。*/5 等价于 0-59/5,匹配的是 0、5、10…55 这些固定时刻,起点是 0 而不是当前时间。

    星期 0 和 7 有区别吗?

    没有区别,都表示周日。部分实现只接受 0,为了可移植性建议统一写 0。本工具两个值都支持。

    日期和星期同时限定时是什么关系?

    Linux cron 中是「或」关系:满足任意一项即执行。例如 0 0 1 * 1 表示每月 1 号或每个周一的 0 点执行,而不是同时满足。

    星号、逗号、连字符、斜杠分别是什么意思?

    星号 * 表示每个值都匹配;逗号 , 用于列举多个值;连字符 - 表示范围;斜杠 / 表示步长,例如 */5 表示每 5 个单位。

    各字段的取值范围是多少?

    分钟 0-59、小时 0-23、日期 1-31、月份 1-12、星期 0-6(0 和 7 都表示周日);6 段格式的秒为 0-59。

    Cron 表达式有几个字段?

    标准是 5 段:分钟、小时、日期、月份、星期。部分框架(如 Quartz、Spring)使用 6 段格式,在最前面多一个「秒」字段。本工具可切换两种格式。