Skip to content

Crontab 生成器与 Cron 表达式构建工具

在浏览器里构建、校验并解读 cron 表达式,按本地时间或 UTC 实时预览下一次运行。支持 POSIX 五字段语法、常用预设和中文描述。免费、隐私、无需注册。

无追踪 浏览器中运行 免费
所有解析与下次运行计算都在你的浏览器本地完成,不会向任何服务器发送数据。

字段
预设

中文描述

接下来 5 次运行

下次运行预览的时区
    已审核 POSIX 五字段合规性、OR 语义正确性、步长锚定行为、命名 token 展开,以及对 Quartz 运算符的清晰拒绝与友好错误提示 — Go Tools 工程团队 · 2026年5月20日

    什么是 Cron 表达式?

    cron 表达式是一个五字段字符串,用来定义循环排程。从左到右依次是:分(0-59)、时(0-23)、日(1-31)、月(1-12)、星期(0-6,其中 0 和 7 都表示周日)。每个字段都接受单值、列表(`1,3,5`)、区间(`1-5`)、通配符(`*` 表示任意),或步长(`*/15` 表示每 15)。五个字段的组合精确定义任务的运行时刻——比如 `0 9 * * 1-5` 可以读作「在第 0 分、第 9 时、任意日、任意月、星期一至星期五」,用中文说就是「工作日上午 9:00」。

    cron 诞生于 1979 年的 Unix V7,五字段语法 40 多年来几乎未变——这本身就是对原始设计精良的最好印证。如今 cron 表达式早已超出 Unix crontab 的范畴:Kubernetes CronJob、GitHub Actions workflow、AWS EventBridge 规则、GitLab CI 定时流水线、Cloudflare Workers Cron Triggers,以及各家云的无服务器平台都接受同一套五字段语法。学会一次 cron,就掌握了在现代基础设施里安排定时任务的通用语言。

    POSIX 标准定义了五个运算符:`*`(任意值)、`,`(值列表)、`-`(区间)、`/`(步长),以及月份(JAN-DEC)和星期(SUN-SAT)的命名符号。大多数实现还支持五个常用宏:`@yearly`(`0 0 1 1 *`)、`@monthly`(`0 0 1 * *`)、`@weekly`(`0 0 * * 0`)、`@daily`(`0 0 * * *`)、`@hourly`(`0 * * * *`)。Quartz 调度器(Java 库)在此基础上扩展了可选的秒字段和额外运算符(`?`、`L`、`W`、`#`)——在 Java/Spring 项目里很有用,但无法移植到标准 cron。本工具采用 POSIX 五字段标准,因为它是主流,也是你的 Linux 服务器、GitHub Actions runner 和 Kubernetes 集群真正能识别的方言。

    POSIX cron 还有一个值得特别留意的细节:当「日」和「星期」都被限定(都不是 `*`)时,只要其一匹配,排程就会触发——是 OR 语义,不是 AND。因此 `0 0 1 * 5` 会在每月 1 日运行,同时也会在每个周五运行,而不是「正好是 1 日的周五」。这是 cron 最常见的意外行为;本工具的下次运行预览会直接展示排程实际触发的具体时间,让结果一目了然。部署前请务必先核对。

    所有解析与下次运行计算都完全用 JavaScript 在你的浏览器里完成——表达式、排程或任何其他数据都不会发送到服务器。本工具能即时解析任意标准 POSIX cron 表达式,给出中文描述与 5 次运行预览,全程隐私。

    cron 表达式与其他开发者工具关系紧密。Cron 任务调试时常常需要比对 Unix 时间戳与预期运行时刻;复杂排程也常以 JSON 配置文件的形式记录,可以用我们的 JSON 格式化工具校验。需要深入了解 OR 语义、时区陷阱以及 Linux、Kubernetes、GitHub Actions 上各种 cron 变体的具体例子,请阅读我们的 cron 排程参考指南。

    # Linux crontab entry — runs every 15 minutes
    */15 * * * *  /usr/local/bin/poll-api.sh
    
    # Kubernetes CronJob — weekdays at 9:00 AM UTC
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: daily-report
    spec:
      schedule: "0 9 * * 1-5"
      timeZone: "UTC"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
                - name: report
                  image: report-runner:1.0
              restartPolicy: OnFailure
    
    # GitHub Actions workflow — hourly
    on:
      schedule:
        - cron: '0 * * * *'
    
    # AWS EventBridge — first of each month
    ScheduleExpression: cron(0 0 1 * ? *)
    # (Note: AWS uses the Quartz 6-field form with '?' for day-of-week)

    核心特性

    实时 POSIX 五字段解析

    严格遵循 POSIX cron 的解析器:分(0-59)、时(0-23)、日(1-31)、月(1-12 或 JAN-DEC)、星期(0-6 或 SUN-SAT,7 也接受为周日)。完整支持标准运算符(`*` `,` `-` `/`)和宏(`@yearly` `@monthly` `@weekly` `@daily` `@hourly`)。

    下次运行预览(5 次)

    基于你当前的本地时间,计算接下来五次运行时刻。一键在「本地」与「UTC」之间切换——在把 crontab 部署到不同时区的服务器之前,这是发现时区意外最可靠的方法。

    中文描述

    每个有效表达式都会生成可读的中文解释:「每 15 分钟」「工作日上午 9:00」「一月和七月每月 1 日 02:30」。让代码评审和团队交接毫不费力——不必再猜 `*/5 9-17 * * 1-5` 到底什么意思。

    字段级错误提示

    无效表达式会即时给出红色提示,高亮出错字段并给出具体错误:「分钟字段错误:值超出范围 [0, 59]:"60"」。再也不会等到三天后报表没跑出来才发现 crontab 静默失败。

    常用排程预设按钮

    11 个一键预设覆盖你真正会用到的排程:每分钟、每 5/15 分钟、每小时、每天 0 点或上午 9 点、工作日上午 9 点、每周日/周一、每月 1 日、每年第一天。点选、微调、发布。

    分字段构建输入

    不用背五字段的顺序——五个分别标着「分钟」「小时」「日」「月」「星期」的小输入框让你一次只编辑一个位置,不会漏值或错位。顶部完整表达式会自动重建。

    正确的 POSIX OR 语义

    当「日」和「星期」都被限定时,OR 规则生效——`0 0 1 * 5` 既在每月 1 日运行,也在每个周五运行。下次运行预览会在你部署之前把这件事摆在桌面上,杜绝周末意外告警。

    100% 浏览器端隐私

    你的 cron 表达式——往往透露着基础设施时序和内部排程模式——绝不会离开你的浏览器。不向任何服务器发送数据、不记录、不分析。你可以在浏览器 Network 面板自行验证。生产环境排程与内部系统都可放心使用。

    Quartz 感知的错误提示

    如果你粘贴了带 `?` `L` `W` 或 `#` 的 Quartz 表达式,解析器会提示「不支持 Quartz 运算符——请使用 POSIX 语法」,让你及时改写而不是去排查一个静默失败。Quartz 排程跑不在 Linux cron 上。

    Cron 变体与调度器

    Vixie cron(Linux 默认)

    五字段 POSIX

    绝大多数 Linux 发行版的默认实现。严格遵循 POSIX,并扩展 `CRON_TZ=` 用于显式时区。日/星期 OR 语义适用。是本工具的主要目标。

    BSD cron

    五字段 POSIX

    macOS 与 BSD 家族的默认实现。POSIX 兼容,与 vixie cron 仅有细微实现差异;绝大多数表达式行为一致。

    systemd timer(OnCalendar)

    日历规约,非 cron

    systemd Linux 上 cron 的替代品。使用 `OnCalendar: 2026-*-* 09:00:00` 这类语法——对非循环排程更可读,但与 cron 表达式互不兼容。

    Quartz Scheduler(Java/Spring)

    六或七字段

    增加秒(必选)和年(可选)字段,外加运算符 `?`、`L`、`W`、`#`。在 Java 应用里很有用,但无法移植到 Linux cron。

    AWS EventBridge

    六字段 Quartz 风格,使用 `?`

    当只限定其一时,「日」或「星期」必须写 `?`(Quartz 约定)而不是 `*`。表达式无法直接搬到 Linux cron。

    Kubernetes CronJob

    五字段 POSIX + timeZone 字段

    POSIX 五字段排程加 `spec.timeZone`(1.27+)。比依赖 kubelet 主机时区更干净。表达式可直接从 Linux cron 迁移过来。

    GitHub Actions

    五字段 POSIX

    始终运行在 UTC。尽力而为的时间触发——负载高时可能被跳过。避免短于 15 分钟的间隔。表达式可直接从 Linux cron 迁移过来。

    Cron 表达式示例

    每 15 分钟

    */15 * * * *

    步长运算符:分钟字段里 `*/15` 表示「从第 0 分钟开始,每 15 分钟一次」——也就是每小时的 :00、:15、:30、:45 各运行一次。是 API 轮询、缓存刷新和心跳检测最常见的间隔。

    工作日上午 9:00

    0 9 * * 1-5

    星期字段的区间 `1-5` 表示周一到周五(1=周一,5=周五),整点 09:00 触发——适合工作时间报表、依赖夜间数据的批处理任务,以及每日站会提醒。

    每月 1 日 0 点

    0 0 1 * *

    「日」字段为 `1`,其他较低字段均为 0。常用于月度账单、日志轮转和期末对账。「日」与「星期」只有在两者都不是 `*` 时才会互相影响——这里星期是 `*`,所以只看日期。

    工作日上午 9 点到下午 5 点,每 5 分钟

    */5 9-17 * * 1-5

    在不同字段上组合步长(`*/5`)与区间(`9-17`)。适合仅工作时间的监控或队列消费。总计:每小时 12 次 × 9 小时 × 5 天 = 每周 540 次。

    季度任务:1 月、4 月、7 月、10 月 1 日 0 点

    0 0 1 JAN,APR,JUL,OCT *

    用英文缩写以逗号分隔的月份列表。适合财务结账、代码冻结评审或合规审计等季度任务。名称和数字可以混用(`1,APR,7,10` 解析结果一致),但建议统一风格以提升可读性。

    POSIX OR 陷阱:每月 1 日或每个周五

    0 0 1 * 5

    当「日」(`1`)和「星期」(`5`)都被限定时,POSIX cron 只要其一匹配就会触发。因此这条表达式会在每月 1 日运行,同时也会在每个周五运行——并非只在「正好是 1 日的周五」运行。这是 cron 最常见的意外行为之一;下次运行预览会让结果一目了然。

    每天 02:30(低峰时段)

    30 2 * * *

    时和分都是具体值,其他位置通配。02:00-04:00(UTC)是夜间批处理任务的事实标准,因为它与所有主要业务地区的工作时间都不冲突。配合 UTC 时区开关使用,可以确认任务落在预期时段。

    宏等价:@daily

    @daily

    `@daily` 简写(也写作 `@midnight`)展开后等于 `0 0 * * *`——每天 0 点。其他宏:`@yearly` = `0 0 1 1 *`、`@monthly` = `0 0 1 * *`、`@weekly` = `0 0 * * 0`、`@hourly` = `0 * * * *`。宏写起来简洁,但五字段形式在不同调度器之间更通用(部分调度器不支持宏)。

    如何构建 Cron 表达式

    1. 1

      键入或粘贴 cron 表达式

      在顶部输入框中输入一个五字段 cron 表达式(例如 `*/15 * * * *`)。工具会随键入实时解析与校验——有效则显示绿色对勾,无效则显示红色提示并指出出错字段。`@daily`、`@hourly` 等宏也可接受。

    2. 2

      或微调五个字段输入

      不用背字段顺序——通过标注好的输入框分别编辑「分钟」「小时」「日」「月」「星期」。顶部完整表达式会自动更新。用 `*` 表示通配,`*/N` 表示步长,`a-b` 表示区间,`1,3,5` 表示列表。

    3. 3

      点选预设快速起步

      点击任意预设按钮(每 15 分钟、工作日上午 9 点等)即可载入一个常用排程,然后再按需微调字段。11 个预设覆盖了生产环境里真正会用到的模式。

    4. 4

      核对下次运行预览

      查看接下来五次的运行时刻——切换「本地」与「UTC」确认排程在你期望的时刻触发。这是部署前发现 POSIX「日/星期」OR 陷阱最可靠的方法。

    5. 5

      复制并粘贴到调度器

      点击「复制」获取表达式。粘贴到 crontab、systemd timer、GitHub Actions 的 `cron:`、AWS EventBridge、Kubernetes CronJob 的 `schedule`,或任何兼容 cron 的调度器。别忘了确认目标调度器的时区——参见下文「最佳实践」。

    常见 Cron 错误

    POSIX OR 陷阱:两个「日」字段同时被限定

    当「日」和「星期」都被限定时,POSIX cron 只要其一匹配就触发——并非要求同时满足。因此 `0 0 1 * 5` 会在每月 1 日运行,同时也会在每个周五运行,而不是「正好是 1 日的周五」。想要单一条件时,请在两个「日」字段里至少留一个为 `*`;或者写一个外层脚本完成 AND 判断。

    ✗ 错误
    # 本意:「每月第一个周五」
    0 0 1-7 * 5
    # 实际:每月 1 日到 7 日的所有日子,或者每个周五——两个条件都会触发
    ✓ 正确
    # 用外层脚本实现真正的 AND 语义
    0 0 * * 5  [ $(date +\%d) -le 7 ] && /your-script
    # 或者放弃一个条件,接受更宽松的排程

    开发与生产环境时区漂移

    Linux 服务器上的 cron 排程使用系统时区,不是编写者的本地时区。把一条「上午 9:00」cron 部署到 UTC 服务器,会在美东时间凌晨 4:00 触发。请始终对照目标服务器的时区(最好是 UTC)来设计排程,并在 crontab 顶部用 `CRON_TZ=...` 显式锁定。

    ✗ 错误
    # 美东开发者写好后部署到 UTC 服务器
    0 9 * * *  /your-report.sh
    # 实际在 UTC 9 点触发 = 美东凌晨 4 点 —— 不是开发者的本意
    ✓ 正确
    # 锁定时区,或直接按 UTC 编写
    CRON_TZ=America/New_York
    0 9 * * *  /your-report.sh

    步长混淆:`*/15` 与 `15`

    分钟字段里的 `*/15` 表示「从 0 开始每 15 分钟一次」(即 0、15、30、45)。单独写 `15` 则表示「只在第 15 分钟」——每小时只跑一次。初学者常把 `15` 当成「每 15 分钟」;本工具的中文描述能在部署前把这种错误暴露出来。

    ✗ 错误
    # 本意:每 15 分钟
    15 * * * *
    # 实际:每小时一次,仅在第 15 分钟触发(每小时少了 3 次)
    ✓ 正确
    # 正确写法
    */15 * * * *
    # 每 15 分钟:每小时的第 0、15、30、45 分钟

    把六字段表达式贴给 POSIX 调度器

    Quartz/Spring/node-cron 支持把秒作为可选的首位字段。但 Linux crontab、GitHub Actions、AWS EventBridge(大部分情况)和 Kubernetes CronJob 不支持——它们期望五字段。粘贴一个六字段表达式会静默打乱排程:你的「秒」会被当成「分」,「分」会被当成「时」,以此类推。

    ✗ 错误
    # Quartz 六字段被复制进 Linux crontab
    0 0 9 * * 1-5
    # Linux 解析为:分=0、时=0、日=9、月=*、星期=1-5
    # = 月份匹配星期的每月 9 日 0 点 —— 完全乱了
    ✓ 正确
    # POSIX 五字段,去掉首位秒
    0 9 * * 1-5
    # = 工作日上午 9:00

    「日」超出当月最大天数

    cron 不会按实际月份去校验「日」。`0 0 31 2 *`(2 月 31 日)能正常解析但永远不会匹配——2 月最多 29 天。初学者以为解析器会拦截这种情况;它不会。本工具的下次运行预览会在表达式结构合法但逻辑上不可能时显示「未来 4 年内无运行计划」。

    ✗ 错误
    # 2 月 30 日或 31 日 —— 永远不会运行
    0 0 30 2 *
    0 0 31 2 *
    # 能解析,但永远没有排程触发
    ✓ 正确
    # 用脚本配合实现「2 月最后一个工作日」
    0 0 28-29 2 *  [ $(date -d tomorrow +\%m) = 03 ] && /your-script

    把 Quartz 语法误当成 POSIX

    AWS 文档、Spring 教程,以及很多 Stack Overflow 回答里展示的是带 `?`、`L`、`W` 或 `#` 的 Quartz cron 表达式,它们在 Linux crontab 上跑不起来。如果你把一个「星期」位置是 `?` 的六字段表达式复制到 Linux,解析器要么拒绝,要么悄悄解析错。本工具会识别 Quartz 运算符并解释二者的区别。

    ✗ 错误
    # Quartz:「每月最后一个周五」—— POSIX 无效
    0 0 ? * 6L *
    ✓ 正确
    # 用 POSIX 外层脚本实现「最后一个周五」
    0 0 25-31 * 5  /your-script
    # 在任意月份的 25-31 日且为周五时运行

    常见使用场景

    Linux Crontab 任务
    构建并验证 `/etc/crontab`、`/etc/cron.d/*` 或单用户 `crontab -e` 中的条目。保存前先用下次运行预览确认排程在服务器配置时区下落在预期时刻。
    Kubernetes CronJob 排程
    生成 Kubernetes CronJob 的 `spec.schedule` 字段。Kubernetes 1.27+ 还支持 `spec.timeZone`——切到 UTC 设计你的排程,然后显式设置 `timeZone`,避免被工作节点的本地时间带偏。
    GitHub Actions 定时工作流
    构建 `on.schedule` 下的 `cron:` 条目。GitHub Actions 始终运行在 UTC——把预览切到 UTC 来确认你的排程。避免小于 15 分钟的间隔;GitHub 调度器在负载下会跳过短间隔任务。
    AWS EventBridge 规则
    为 EventBridge 定时规则构造 cron 表达式。注意:AWS 使用 Quartz 风格的六字段语法,「星期」用 `?`——本工具输出 POSIX 五字段,你需要在前面补一位秒(`0`),并把两个「日」字段中只有一个限定时另一个的 `*` 换成 `?`。
    GitLab CI 定时流水线
    校验 GitLab 定时 CI 流水线的 cron 表达式。GitLab 使用 POSIX 五字段语法——正是本工具输出的形式。GitLab 也提供 UI 日期选择器,但 cron 形式在非标准间隔下能给你更精细的控制。
    Cloudflare Workers Cron Triggers
    构造 `wrangler.toml` 里的 `[triggers.crons]` 条目。Cloudflare 使用 POSIX 五字段语法,最小间隔为 1 分钟,worker 运行在 UTC。用预览确认触发落在预期窗口内。
    Node.js node-cron 排程
    为 `node-cron` 库构建表达式——它同时支持五字段 POSIX 和可选的首位秒字段。除非真的需要亚分钟精度,否则建议坚持五字段;六字段表达式无法搬到 Linux crontab。
    代码评审与文档
    把 PR 或 runbook 里的 cron 表达式粘进来,立刻知道它在做什么——不必再对着 `30 7 * * 1-5` 苦思,也不用翻参考卡片。中文描述也很适合放在内联注释和 README 中。

    Cron 语法参考

    字段顺序:分 时 日 月 星期
    分(0-59)、时(0-23)、日(1-31)、月(1-12)、星期(0-6,7 也表示周日)。「星期」字段同时接受数字(0-6)和英文缩写(SUN-SAT,大小写不敏感)。
    运算符
    `*` = 任意值;`,` = 列表分隔(`1,3,5`);`-` = 区间(`1-5`);`/` = 步长(`*/15`、`5/10`);名称:月份 JAN-DEC、星期 SUN-SAT(大小写不敏感)。
    宏(别名)
    `@yearly` = `0 0 1 1 *`;`@annually` = `0 0 1 1 *`;`@monthly` = `0 0 1 * *`;`@weekly` = `0 0 * * 0`;`@daily` = `0 0 * * *`;`@midnight` = `0 0 * * *`;`@hourly` = `0 * * * *`。`@reboot` 是特殊的非排程宏(仅在系统启动时运行),会被本工具拒绝并附说明。
    POSIX 日/星期语义(OR 规则)
    当「日」和「星期」都被限定(都不是 `*`)时,只要其一匹配,排程就会触发——OR 语义。仅其一被限定时,由该字段决定。两者都是 `*` 时,每天都匹配。这条 OR 规则适用于 vixie cron、BSD cron 和大多数 POSIX 实现;Quartz 则用 `?` 来在 AND 与 OR 之间消歧。
    六字段模式(Quartz-Lite)
    如果输入有六个空格分隔的 token,本工具会把首位当作秒字段(0-59)。这对 Quartz、Spring `@Scheduled(cron=...)` 和 node-cron 很有用。不可移植到 Linux crontab 或 POSIX 调度器——它们会把你的「秒」当成「分」,把后续字段整体往前错一格。
    步长运算符的锚定
    `*/N` 锚定到字段的最小值:分钟里的 `*/15` = `0,15,30,45`,而不是「从现在起每 15 分钟」。基准非通配时:分钟里的 `5/15` = `5,20,35,50`。如果步长不能整除字段区间,在回绕处会跳过——这是正确行为,不是 bug。
    校验边界
    分 ∈ [0,59]、时 ∈ [0,23]、日 ∈ [1,31]、月 ∈ [1,12]、星期 ∈ [0,7]。超出范围的值会产生字段级错误。「日」不会按实际月份校验(`0 0 31 2 *` 能正常解析,但永远不会触发,因为 2 月没有 31 日——下次运行预览会显示「未来 4 年内无运行计划」)。
    拒绝 Quartz 运算符
    POSIX cron 不支持 Quartz 的 `?`(无特定值)、`L`(last)、`W`(最近工作日)和 `#`(每月第 n 个星期几)。本工具会以明确的「不支持 Quartz 运算符」错误信息拒绝它们,而不是悄悄按 POSIX 解析失败。Quartz 排程请用 Quartz 感知的工具或 Spring 调度器。
    下次运行搜索的年份上限
    下次运行计算最多向前搜索 4 年;触发频率比这更低的表达式(例如「2 月 29 日」模式)会显示「未来 4 年内无运行计划」。这是为了避免在不可能匹配的模式上无限迭代而做的设计。

    Cron 排程最佳实践

    服务器统一 UTC,显示时再转本地
    把服务器设为 UTC(`/etc/timezone` 或 `TZ=UTC`),所有 cron 表达式都按 UTC 编写。只在 dashboard 和报表展示时转换为本地时间。这能消灭一整类时区 bug——它们在夏令时切换时危害最大,本地时间排程会无声地重复触发或漏跑。借助本工具的 UTC 开关,从一开始就按 UTC 设计排程。
    避开 POSIX「日/星期」OR 陷阱
    除非你确实想要 OR 语义,否则永远不要同时限定「日」和「星期」。如果想要「一月份的每个周一」,写 `0 0 * 1 1`(「日」是 `*`);想要「每月 1 日」,写 `0 0 1 * *`(「星期」是 `*`)。POSIX 的 OR 规则会让 `0 0 1 * 1` 在每月 1 日和每个周一都触发——几乎不可能是你的本意。部署前先看下次运行预览,就能及时捕获这种问题。
    在排程定义里显式锁定时区
    现代调度器都支持在排程定义里固定时区:crontab 顶部加 `CRON_TZ=America/New_York`(vixie cron 3.0+);Kubernetes CronJob 1.27+ 用 `spec.timeZone: "America/New_York"`;AWS EventBridge Scheduler 在排程表达式上配 `ScheduleExpressionTimezone`。显式锁定时区,不要依赖服务器默认——基础设施迁移时服务器时区可能毫无征兆地变化。
    把负载分散到不同分钟,避免都堆在 :00
    非关键任务避免使用 `0 * * * *`(每小时第 0 分钟)——规模上来后,所有事情都挤在 :00 会造成负载尖峰。为每个任务挑一个随机分钟偏移(`23 * * * *`、`41 * * * *`)来分散压力。每日任务同理:当大量任务都赶在 3:00 时,`30 3 * * *` 比 `0 3 * * *` 对数据库更友好。
    让任务幂等
    cron 没有内建重试、没有重叠保护、没有错过恢复。你的任务必须能安全地多次运行(幂等)并自我检查。与其写「上午 9 点发送报表」,不如写成「如果今天的报表还没发,就发送」——这能在宕机、误重复排程、并发触发后自愈。幂等是任务自身的属性,不是调度器的属性,也是最重要的可靠性实践。
    为关键排程加心跳监控
    cron 最大的弱点就是静默失败——排程没触发时,没有任何提示。关键任务可以在执行结束时给心跳服务(Healthchecks.io、Cronitor、Dead Man's Snitch)发一次 ping;预期 ping 没到时,服务会告警。这能同时捕获「任务失败」和「排程根本没触发」两种情况。免费额度足以覆盖个人和小团队的常见需求。
    上线前用下次运行预览核对一遍
    部署新 cron 排程前,先看本工具预览里接下来的五次运行时刻,切换「本地」与「UTC」核对。确认排程落在你期望的时刻——不会提早五分钟、不会跑错日子、不会漏掉你在意的周末。预览是成本最低的「生产环境测试」。

    常见问题

    这个工具是做什么的?
    它在你的浏览器里解析、校验并解读 cron 表达式,并按你所在时区或 UTC 实时预览接下来 5 次运行时刻。输入任意标准 POSIX 五字段 cron 表达式——或通过预设按钮和分字段输入框来构建一个表达式,无需死记语法——工具会输出中文描述(如「每 15 分钟」「工作日上午 9:00」)以及任务实际触发的具体时间点。错误的表达式会立即给出字段级报错,避免你部署后才发现排程坏了。整个工具 100% 在客户端运行:不会上传、不会记录、不会保存——生产环境 crontab 和包含敏感时序信息的内部排程都可以放心粘贴。
    什么是 cron 表达式?
    cron 表达式是一个五字段字符串,用来定义循环排程。从左到右依次是:分(0-59)、时(0-23)、日(1-31)、月(1-12)、星期(0-6,其中 0 和 7 都表示周日)。每个字段都接受单值、列表(`1,3,5`)、区间(`1-5`)、通配符(`*` 表示任意),或步长(`*/15` 表示每 15)。五个字段的组合精确定义了任务的运行时刻。cron 诞生于 1979 年的 Unix V7,至今仍是 Linux/Unix 上时间驱动任务调度的事实语言,也广泛用于容器编排(Kubernetes CronJob)、CI/CD(GitHub Actions、GitLab CI)和无服务器平台(AWS EventBridge、Cloudflare Workers Cron Triggers)。几十年来涌现过许多替代方案,但没有一个能撼动 cron 这套简洁而富有表达力的五字段语法。
    我的数据会被上传到任何地方吗?
    不会。所有解析、校验和下次运行计算都 100% 用 JavaScript 在你的浏览器里运行。你的表达式不会被传输、不会保存在任何服务器、不会被记录、不会被分析。这意味着该工具可以安全用于生产 crontab、可能透露基础设施时序的内部排程,以及任何敏感的排程任务。你可以在浏览器的 Network 面板里自行验证——键入 cron 表达式触发的网络请求数为零。工具也不使用任何 cookie 来保存输入数据,没有任何第三方分析会捕获你键入的内容。
    POSIX cron 与 Quartz 有什么区别?
    POSIX cron 是五字段标准,被 Unix/Linux crontab、systemd timer、GitHub Actions、GitLab CI、AWS EventBridge、Kubernetes CronJob 以及大多数调度器采用。Quartz 是 Java 的调度库,增加了「秒」字段(合计六或七字段)和额外运算符:`?`(无特定值,用于「日」和「星期」冲突时)、`L`(last,例如月末、最后一个周五)、`W`(最近的工作日)、`#`(每月第 n 个星期几,例如 `2#1` = 当月第一个周二)。本工具实现的是 POSIX cron,因为它的使用范围远更广;Quartz 运算符会被识别为语法错误并提示「不支持 Quartz 运算符」。如果你确实需要 Quartz,目标通常是 Quartz Scheduler 或 Spring 的 `@Scheduled` 这类 Java 调度器——但这些排程定义无法直接搬到 Linux cron。
    为什么 '0 0 1 * 5' 会在每个周五和每月 1 日都触发?
    这是 POSIX cron 关于「日」和「星期」的 OR 语义,也是 cron 最常见的意外行为。规则是:当两个字段都被限定(都不是 `*`)时,只要其一匹配 cron 就会触发任务——不是要求同时满足。因此 `0 0 1 * 5`(日=1,星期=5)会在每月 1 日触发,同时也会在每个周五触发,而不是仅仅「正好是 1 日的周五」。如果你想要后者(AND 语义——同时是 1 日和周五),标准 cron 写不出来;你需要在脚本里判断每月 1 日或每个周五运行,再按实际日期提前退出。Vixie cron(GNU/Linux 默认)、BSD cron 和 AWS EventBridge 都遵循这条 OR 规则。本工具的下次运行预览会让实际排程一目了然——粘贴可疑表达式,先验证再部署。
    如何让任务每 30 秒运行一次?
    用标准 POSIX cron 做不到。cron 的最小粒度是 1 分钟——最小字段是「分」(0-59)。如果需要亚分钟级排程,可以考虑:(1)两条 `* * * * *` 任务,其中一条前面加 `sleep 30 &&`——粗糙但对 vixie cron 有效。(2)使用支持秒级的调度器,如 Quartz、配合自定义控制器的 Kubernetes CronJob,或写成 `OnCalendar: *-*-* *:*:00/30` 的 systemd timer。(3)跑一个长时常驻进程,每次循环 sleep 30 秒——这是大多数监控类需求的正解。(4)如果你确实需要实时响应,改用事件驱动(webhook、消息队列)。一旦你想用「30 秒级 cron」,往往说明 cron 已经不是合适的抽象了。
    cron 使用什么时区?
    在 Linux 服务器上,vixie cron 使用系统时区——通常通过 `/etc/timezone` 或环境变量 `TZ` 设置。这是 bug 的常见来源:美东服务器的「上午 9:00」cron 实际在 UTC 14:00 触发,但如果服务器设置为 UTC,则在 UTC 09:00(也就是美东时间凌晨 4:00)触发。解决方案要么是把所有服务器统一设为 UTC 并按 UTC 编写所有 cron 表达式,要么在 crontab 顶部加一行 `CRON_TZ=America/New_York` 来显式锁定时区(vixie cron 3.0+ 支持)。托管型调度器各有差异:GitHub Actions 始终运行在 UTC;AWS EventBridge 支持在排程定义里指定时区;Kubernetes CronJob 在 1.27+ 加入了 `spec.timeZone` 字段。本工具的 UTC/本地切换让你可以在两种时区下预览排程——切换确认任务确实落在你预期的时刻。
    '*/15' 实际展开成什么?
    步长运算符 `*/N` 的含义是「从字段的最小有效值开始,每 N 触发一次」。对分钟字段(区间 0-59),`*/15` 展开为 `0,15,30,45`——每小时四次,在每刻钟整点。步长不是「从当前时间开始每 15 分钟」,而是锚定到字段的起始值。其他字段同理:时字段的 `*/2` = `0,2,4,...,22`(12 次);日字段的 `*/3` = `1,4,7,...,31`(11 次)。当步长基准不是通配符时(例如 `5/15`),展开是从该基准开始:`5/15` 在分钟字段 = `5,20,35,50`。若步长不能整除字段区间,在回绕处会跳过——这是正确的 cron 行为,不是 bug。下次运行预览会让实际排程一目了然。
    可以使用带秒字段的六字段表达式吗?
    首位为「秒」字段(区间 0-59)的六字段表达式是 Quartz/Spring/Cron4j 的扩展,并非 POSIX。当你输入恰好六个空格分隔的 token 时,本工具会按六字段解析——这在你面向 Quartz、Spring `@Scheduled(cron=...)`,或支持秒的 Node.js 库(如 `node-cron`)时很有用。对于标准 POSIX 调度器(Linux crontab、GitHub Actions、AWS EventBridge、Kubernetes CronJob),请坚持使用五字段——多出一个秒字段会让排程静默错乱(调度器会把你的「分」当成「秒」、把「时」当成「分」,整体错位一格)。拿不准时查阅目标调度器的文档;如果文档里没有明确写「支持带秒的六字段」,就用五字段。
    cron 能表达的最大间隔是多少?
    在没有外部状态的情况下,cron 可以可靠地表达「每年一次」,如 `0 0 D M *`(例如 `0 0 1 1 *` = 每年 1 月 1 日 0 点)。对于「每两年」或更长的间隔,光靠 cron 不够——你需要在脚本顶部加一个外部日期判断(例如 `[ $(($(date +%Y) % 2)) -eq 0 ] && /your-command` 仅在偶数年运行)。对于「每 90 天」或其他非对齐的多日间隔,cron 同样不够:没有原生的取模运算符,你需要写一个包装脚本,对照参考日期计算「一年中的第几天」。如果你的排程需求复杂到这个程度,请考虑真正的工作流调度器(Airflow、Temporal、AWS Step Functions)——cron 的语法刻意保持简单,超出常规周/月模式后就会力不从心。
    宕机后错过的任务怎么处理?
    标准 cron 没有恢复机制——如果排程时刻系统刚好不在线,那次运行就直接跳过,也没有「我们漏了一次」的日志。对关键任务,有三种选择:(1)使用 `anacron`(或 `systemd-cron` 加 `Persistent=true`),在开机后补跑错过的任务,适合笔记本和间歇性运行的系统。(2)改用内建重试的调度器:Kubernetes CronJob 有 `startingDeadlineSeconds`(延迟在窗口内仍可运行)和 `concurrencyPolicy`(避免重叠);AWS EventBridge 支持重试策略。(3)让任务本身具备幂等性:与其写「上午 9 点发送报表」,不如写「今天的报表如果还没生成,就生成它」——任何宕机时长之后都能自愈。第三种最稳健,与任何调度器都兼容。
    为什么我的 GitHub Actions cron 不按时运行?
    GitHub Actions 排程是尽力而为:在 GitHub 基础设施负载较高时可能延迟几分钟触发,负载非常高时甚至会被整次跳过(尤其是「每 5 分钟」这类短间隔)。同样的免责声明也适用于大多数托管型调度器——它们以精确时间为代价换取规模和可靠性。实际启示:(1)不要排程必须精确到秒触发的任务;cron 适合「每天大约这个时刻」。(2)短间隔任务请用长驻 worker 而非定时任务。(3)涉及金融或合规截止时刻的精确触发,请用你自己控制的 cron 守护进程,或更严格的调度器如 AWS EventBridge Scheduler 的 Standard schedule。(4)GitHub Actions 特别提示:避免小于 15 分钟的间隔;调度器在负载下经常跳过短间隔任务。