跳到主要内容
实用工具2026-07-08Begin5 分钟阅读

在线 Cron 表达式解析器:可视化理解定时任务调度

什么是 Cron 表达式

Cron 表达式是一种用于配置定时任务调度的字符串格式,广泛应用于 Linux crontab、CI/CD 流水线、Node.js 定时任务和分布式任务调度系统。把表达式粘贴到 Cron 表达式解析器 里,立刻能看到每个字段展开后的合法取值、一段人类可读描述,以及浏览器本地时区下接下来 5 次触发——适合回答「这串到底在说什么」和「按本地钟它大概几点响」。

下次触发按 Vixie 日/周 OR 语义推算,并显式标注「浏览器本地时区」。它不是目标服务器日历:云主机常为 UTC,容器未设 TZ 时也常是 UTC——预览结果要换算到部署时钟,或在机器上跑低频探测日志。需要从需求反向拼表达式时,用 Cron 生成器。

一个标准的 Cron 表达式由 5 个时间字段组成:

┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日期 (1-31)
│ │ │ ┌───────────── 月份 (1-12 或 JAN-DEC)
│ │ │ │ ┌───────────── 星期 (0-7 或 SUN-SAT;0 与 7 均为周日)
│ │ │ │ │
* * * * *

为什么需要 Cron 表达式解析器

  1. 定时任务配置:服务器备份、数据同步、报表生成
  2. CI/CD 调度:定时构建、定时部署
  3. 监控告警:定期健康检查
  4. 数据处理:ETL 任务、日志轮转
  5. 理解复杂表达式:可视化下一次执行时间

Cron 字段语法

特殊字符

字符含义示例
*任意值* * * * * = 每分钟
,列表1,3,5 * * * * = 第1、3、5分钟
-范围1-5 * * * * = 第1到5分钟
/步长*/15 * * * * = 每15分钟

常见 Cron 表达式

表达式含义
* * * * *每分钟
0 * * * *每小时整点
0 0 * * *每天午夜 0:00
0 9 * * 1-5工作日上午 9:00
0 0 1 * *每月1日午夜
0 0 * * 0每周日午夜
*/5 * * * *每5分钟
0 */2 * * *每2小时
30 8 * * 1每周一上午 8:30
0 0 1,15 * *每月1日和15日午夜

如何使用在线 Cron 解析器

使用 ToolVault 工具匣 的 Cron 表达式解析器:

  1. 输入五段 Cron 表达式(如 */15 * * * *,或 0 9 * * MON-FRI)
  2. 工具展开每个字段的合法取值列表(名称别名会先换成数字)
  3. 显示人类可读描述(英文摘要拼装,便于核对)
  4. 列出接下来 5 次触发(浏览器本地时区;日/周双受限时走 OR)
  5. 字段数不是 5、取值真正越界(如周字段 8)时给出明确错误;周字段 7 会规范为周日 0
  6. 从内置示例起步,改数字或别名观察展开与下次触发变化

代码中的 Cron 使用

Node.js

const cron = require('node-cron');

// 每5分钟执行一次
cron.schedule('*/5 * * * *', () => {
  console.log('运行健康检查');
});

// 每天凌晨2点执行数据备份
cron.schedule('0 2 * * *', () => {
  console.log('执行数据备份');
});

Python

from crontab import CronTab

# 解析 Cron 表达式
cron = CronTab('* * * * *')
print(cron.description())  # "Every minute"

# 获取下一次执行时间
from datetime import datetime
next_run = cron.get_next(datetime)

Go

import "github.com/robfig/cron/v3"

c := cron.New()
// 每5分钟
c.AddFunc("*/5 * * * *", func() {
    fmt.Println("运行健康检查")
})
c.Start()

注意事项

时区问题

Cron 表达式默认使用服务器本地时区。在分布式系统中,建议统一使用 UTC:

# UTC 时间
0 2 * * *    # 每天 UTC 02:00

周日与名称别名

  • 本站解析器:0=周日 … 6=周六;接受 7 并规范为 0(与 Vixie 一致)
  • 月份/星期支持三字母英文名:JAN–DEC、SUN–SAT(大小写不敏感)
  • 多数文档:1=周一(与 ISO 习惯一致,但务必以目标实现为准)

最小粒度

标准 Cron 的最小粒度是分钟。如果需要秒级调度,使用扩展 Cron 语法(如 */5 * * * * *,6 个字段)。六段表达式在本站会报 INVALID_CRON_FORMAT——请先确认目标调度器方言,不要假设「多一段无所谓」。

五字段与各方言的扩展

经典 cron 五字段(分 时 日 月 周)有一条反直觉规则——日和周都受限时它们是「或」不是「与」(「每月 1 号且周一」要在脚本里再判断,不是一条表达式搞定)。下次触发表按同一 OR 规则列点,便于当场识破误解。现代扩展:秒字段(Quartz / Spring 前置)、@daily/@hourly 宏、k8s CronJob(只五字段——把带秒的 Quartz 贴进去会迷惑地失败)。本站 解析器 与 生成器 都绑定经典五字段,跨方言粘贴前先数段数。

时区:字段展开与下次触发是两层

字段展开不依赖浏览器时区——它只把 */15、MON-FRI 变成取值集合。下次 5 次触发则用浏览器本地时钟推算,并标明「浏览器本地时区」。真正决定生产「几点响」的是 daemon / 容器 / CronJob 的时钟:系统 cron 用服务器本地时区;Docker 常默认 UTC;k8s 可显式 timeZone;Quartz 跟 JVM 默认。DST 再加一刀:春令时消失的小时永不执行、秋令时可能跑两遍。纪律:避开模糊的 2–3 点档;预览对齐服务器时区后再上线。

五个让 cron 静默死掉的错误

脚本里的相对路径(cron 的工作目录不是你的——显式 cd);缺失环境(最小 PATH——source profile 或绝对路径);无输出处理(邮件进没人读的 root 信箱——重定向到有轮转的日志);无锁(上一轮超时叠加——flock);无监控(死了三周没人知道——心跳/死信)。运维清单见 Linux crontab 运维指南。

实现注记

describeCron 对输入做空白折叠后要求恰好五段;每段走 * / */n / a-b / a-b/n / a,b,并先把月/周英文名换成数字;周字段允许 7 再规范为 0。getNextCronRuns 在本地时区上按月长迭代候选时刻,日/周双受限时用 OR。返回的 description 仍是英文短语拼装——不是本地化自然语言引擎。

FAQ

Cron 表达式和 crontab 是什么关系?

Cron 表达式是调度规则的字符串表示。crontab 是 Linux 中配置定时任务的文件/命令。你将 Cron 表达式写入 crontab 文件来配置定时任务。

*/15 * * * * 和 0,15,30,45 * * * * 一样吗?

效果相同,都是每 15 分钟执行。*/15 是步长语法的简写形式。

如何设置每周一到周五执行?

使用 0 9 * * 1-5 或 0 9 * * MON-FRI(示例:工作日上午 9 点)。星期字段中 1=周一,5=周五,周日用 0 或 7(本站二者等价)。

「下次执行时间」用的是哪个时区?

解析器预览用浏览器本地时区。若目标机是 UTC,请自行换算,或在服务器上加一条带 date >> /tmp/cron-smoke.log 的低频探测任务做最终确认。


本文出自 ToolVault 工具匣。首页 汇集了更多浏览器本地工具。