开发编码 本地计算 开箱即用 内置示例 不留痕迹

Cron 表达式解析

解析五段式 Cron 表达式(分 时 日 月 周),支持 * , - / 步进、英文缩写(mon、jan)与 @daily 等宏,逐字段给出人话解读并计算接下来 5 次执行时间。日与周同时受限时按标准 Cron 的「或」语义处理,按本地时区计算。

Cron 表达式用五段字段描述定时任务:分、时、日、月、周,依次支持 * 通配、逗号枚举、连字符范围与斜杠步进,另有 @daily 这类宏写法。解析器把每个字段翻成人话,并算出接下来 5 次执行时间,用来确认「我写的表达式是不是真的在每天 0 点跑」。

最容易踩坑的是「日」与「周」同时被限制时的语义:按 Vixie cron 标准是「或」而不是「且」,所以 0 0 13 * 5 表示「13 号或周五」都会执行,而不是「13 号且是周五」。执行时间按服务器本地时区计算,跨时区部署时需先确认容器或系统的时区设置。

使用步骤

  1. 按「分 时 日 月 周」顺序填写五段表达式,例如每天 0 点是 0 0 * * * 。
  2. 不确定字段含义时先只填一段,看下方逐字段的人话解读核对。
  3. 对照「接下来 5 次执行时间」验证是否符合预期,特别留意月末与跨月场景。
  4. 需要「工作日执行」用 1-5 写星期,或直接用 @daily / @weekly 宏更直观。

计算原理与示例

五段式字段顺序

五段从左到右依次是:分钟(0-59)、小时(0-23)、日(1-31)、月(1-12)、星期(0-6,0 是周日)。每段支持 *(任意)、逗号枚举、连字符范围、斜杠步进(*/15 表示从起点每 15 个单位)。

支持的语法

除数字外,星期支持 sun mon tue wed thu fri sat、月份支持 jan~dec 缩写(大小写均可);星期写 7 与 0 等价(都是周日)。@yearly(@annually)、@monthly、@weekly、@daily(@midnight)、@hourly 七个宏(含等价别名)会自动展开成等价五段式。

下次执行时间怎么算

下次执行时间从当前时间的下一分钟开始逐分钟匹配五个字段,最多向前扫描两年。日与星期同时受限时按 Vixie cron 标准语义:日期命中其一即执行(如「13号且周五」实为「13号或周五」)。

代码示例

Crontab 常见写法

# 每天 0 点
0 0 * * *

# 工作日 9 点 30 分
30 9 * * 1-5

# 每 15 分钟
*/15 * * * *

# 每月 1 日凌晨 2 点
0 2 1 * *

# 宏写法
@daily    # 等价于 0 0 * * *
@weekly   # 等价于 0 0 * * 0

Shell 查看与调试

# 列出当前用户的定时任务
crontab -l

# 使用 systemd 定时器时,查看下一次触发时间
systemctl list-timers

# 提示:cron 的环境变量很少,脚本里请用绝对路径并显式设置 PATH

常见问题

五段式 Cron 的字段顺序是什么?

分 时 日 月 周。例如 30 8 * * 1-5 表示工作日 08:30。常见的 Quartz 格式是六段(多一个秒位且星期从 1 开始),本工具按 Linux crontab 的五段式解析,Quartz 表达式需去掉秒位并换算星期后使用。

日和星期同时指定时怎么执行?

标准 Cron(Vixie)语义是「或」:两个字段都不为 * 时,日期匹配其一就会执行。例如 0 0 13 * 5 是「13 号或周五」而不是「13 号且是周五」。工具检测到这种组合会明确提示,避免误配。

@daily 这类宏代表什么?

@yearly(@annually)= 0 0 1 1 * 每年 1 月 1 日零点;@monthly = 0 0 1 * * 每月 1 号零点;@weekly = 0 0 * * 0 每周日零点;@daily(@midnight)= 0 0 * * * 每天零点;@hourly = 0 * * * * 每小时整点。

2 月 30 日这种表达式会怎样?

0 0 30 2 * 永远不会匹配(2 月最多 29 天)。工具向前扫描两年仍找不到匹配时会明确报「两年内不会匹配」错误,而不是静默等待,方便发现配置错误。

时区按什么计算?

按浏览器本地时区计算下次执行时间,与服务器 crontab 按系统时区执行的行为一致。若服务器是 UTC 而你在东八区,注意把小时字段换算 8 小时差,或直接在服务器时区的机器上验证。

星期字段里 0 和 7 一样吗?

一样,都表示周日。0 是标准写法,部分实现接受 7 作为周日的别名,本工具两者都支持并统一按 0 处理。周一到周六分别是 1~6。

支持秒级调度或 @reboot 吗?

不支持。Linux crontab 最小粒度是分钟,秒级调度需要 systemd timer、Quartz 或专门的调度框架;@reboot 表示开机时执行一次,没有固定时间点,无法计算「下次执行时间」,因此不在解析范围内。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。