HandyTools Hub

Cron 表达式生成器

使用可视化构建器生成和理解 Cron 表达式。

直接输入

可视化构建器

常用预设

结果

有效的 Cron 表达式

接下来 5 次执行

    Cron 表达式以极简著称:五个空格分隔的字段,精确决定你的备份何时跑、邮件何时发、报表何时生成。它同样以容易写错著称。这个可视化构建器让你用下拉框选值、或从预设起步,实时生成表达式,用大白话描述它,并在你选定的时区里预览接下来五次执行时间——贴进 crontab 之前就能心里有底。

    五个字段如何配合

    字段的顺序永远固定:

    位置字段允许值
    1分钟0–59
    2小时0–23
    3日1–31
    4月1–12
    5星期0–7(0 和 7 都表示周日)

    四种运算符用来修饰字段。星号 * 匹配任意值。逗号列举备选,所以 0 9,17 * * * 在上午 9 点和下午 5 点运行。连字符表示范围,所以 0 9 * * 1-5 在周一到周五上午 9 点运行。斜杠表示步长,所以 */10 * * * * 每 10 分钟运行一次。构建器把这些做成菜单项,输入菜单里没有的值会作为自定义选项加入,而不是被拒绝。

    运算符可以组合,cron 的大部分表达力就在这里。0 9-17 * * 1-5 表示工作日每天上午 9 点到下午 5 点整点运行——9:00、10:00,一直到 17:00。*/30 9-17 * * 1-5 把它收窄到工作日每小时两次。0 0 1,15 * * 在每月 1 号和 15 号运行。0 0 * * 0,6 在两个周末日的午夜运行。把每个字段从左到右读成一组允许值,并记住每个字段都是针对当前时间独立求值的;字段之间没有算术关系,所以“每 90 分钟”无法用一行 cron 表达。

    用大白话读懂表达式

    结果面板会解释当前表达式,这是发现误解最快的方式。0 0 * * * 读作“每天凌晨 0:00”;0 9 * * 1-5 读作“周一到周五上午 9:00”;0 0 1 1 * 读作“每年 1 月 1 日凌晨 0:00”。如果这句大白话和你的意图不符,就是字段写错了——不用靠猜。

    实操示例

    表达式含义
    * * * * *每分钟
    */5 * * * *每 5 分钟(0、5、10……)
    0 * * * *每小时整点
    0 0 * * *每天午夜
    0 9 * * 1-5工作日早上 9 点
    0 0 * * 0每周日午夜
    0 0 1 * *每月第一天
    0 0 1 1 *每年 1 月 1 日一次

    注意 0 0 1 * * 是每月第一天,而 0 0 * * 1 是每周一——位置很关键,两者乍看很像。

    一个有用的习惯是逐个字段读表达式,并念出“分、时、日、月、星期”。15 14 1 * * 就是“第 15 分钟、第 14 小时、第 1 天、任意月、任意星期”——每月 1 日下午 2:15。如果这句脑内句子和你的意图不符,就在复制字符串之前改字段。解释面板替你完成了这项翻译,所以最快的检查就是看看这句大白话是否描述了你想安排的任务。

    日/星期的 OR 陷阱

    当“日”和“星期”两个字段都受限时,cron 采用 OR 逻辑。0 0 13 * 5 并不表示“13 号且是周五”。它表示“13 号,以及每个周五”。要只在某个具体日期恰好是某个具体星期时运行,需要应用层逻辑或语法更丰富的调度器。这条规则会让有经验的用户也栽跟头,因为它与人们想当然认为处处适用的 AND 逻辑相矛盾。

    时区与下次执行预览

    cron 本身不存储时区,它按主机时钟求值。这里的预览会把接下来五次执行转换到你选择的时区,默认是浏览器所在时区,从而让夏令时切换和 UTC 服务器的问题在部署前就暴露出来。值得检查的两种失败模式是:服务器运行在 UTC 而你想的是本地时间;以及任务排在某次夏令时切换日的凌晨 2 点时段,那个墙上时间可能根本不存在。

    每条预览执行旁边的相对标签(“3 小时后”“2 天后”)按当前时刻计算,所以会随时间刷新,也让计划比预期稀疏得多时一眼可见。如果你以为每小时跑一次的任务显示下次执行“在 7 天后”,那就是某个字段限制了你不该限制的东西。由于预览用的是浏览器时钟,而主机按自己的时钟运行,请务必确认生产环境的时区,而不是假设两者一致。

    常见错误与方言差异

    • 把分钟和小时的位置弄混,把每小时任务变成每分钟任务。
    • 以为 */15 是相对部署时间,而不是相对整点。
    • 在只接受 0–6 的系统里用 7 表示周日,或反过来。
    • 以为 L、W、# 到处都能用——它们是 Quartz 扩展,不是可移植 cron,而这个校验器检查的是标准五字段形式。
    • 忘记托管平台会重命名字段或调整顺序,所以从 crontab 复制来的表达式在 GitHub Actions 或 EventBridge 里可能要先修改。

    相关工具

    常见问题

    为什么我的 cron 任务在错误的小时运行?

    几乎总是时区不匹配。传统 cron 按服务器的本地时区计算,即使你脑子里想的是自己的时间,服务器也可能在用 UTC。这个工具会在可选时区里预览接下来五次执行,让你看到真实墙上时间。在 Linux 上你还可以在 crontab 顶部设置 CRON_TZ=UTC(或其他时区)强制指定;GitHub Actions、Kubernetes CronJob、AWS EventBridge 等托管调度器也各有自己的时区设置。

    日期和星期两个字段都受限时会发生什么?

    cron 对它们做的是 OR,不是 AND。如果两个字段都不是 `*`,只要其中一个匹配任务就会运行。所以 `0 0 13 * 5` 会在每月 13 号触发,也会在每个周五触发,而不是只在周五恰逢 13 号时。这是意外执行最常见的来源。

    */15 * * * * 是从我保存时开始每 15 分钟运行吗?

    不是。步长锚定在字段的起点,而不是任务创建的时间。`*/15` 在每小时的第 0、15、30、45 分钟触发。如果需要不同的相位,必须写出来,例如用 `5 * * * *` 在第 5 分钟运行。

    这个工具用五个字段,但我见过六个或七个,为什么?

    五个字段(分钟、小时、日、月、星期)是经典 Unix crontab 格式。Quartz 和某些 Java 调度器在前面加一个秒字段、后面加一个年字段,所以用六到七个。AWS EventBridge 用分钟在前的六字段形式。字段顺序和特殊字符在不同方言间有差异,请在目标系统里实测。

    0 0 31 2 * 会运行吗?

    不会。二月永远没有 31 号,所以该表达式语法合法但永不触发。调度器不会对不可能的组合作出警告。如果月度任务需要当月最后一天,记住可移植的五字段 cron 没有“最后一天”标记;请改用包装脚本或支持 `L` 的调度器。

    0 * * * * 和 * * * * * 有什么区别?

    `0 * * * *` 每小时运行一次,在第 0 分钟。`* * * * *` 每分钟都运行,一天 1440 次。在分钟字段里放一个具体值,就是每小时和每分钟两种计划的分界,快速扫一眼表达式时很容易看漏。

    由 HandyTools Hub 团队审校 · 最后更新