Cron 表达式解析
解析五段式 Cron 表达式(分 时 日 月 周),支持 * , - / 步进、英文缩写(mon、jan)与 @daily 等宏,逐字段给出人话解读并计算接下来 5 次执行时间。日与周同时受限时按标准 Cron 的「或」语义处理,按本地时区计算。
Cron 表达式用五段字段描述定时任务:分、时、日、月、周,依次支持 * 通配、逗号枚举、连字符范围与斜杠步进,另有 @daily 这类宏写法。解析器把每个字段翻成人话,并算出接下来 5 次执行时间,用来确认「我写的表达式是不是真的在每天 0 点跑」。
最容易踩坑的是「日」与「周」同时被限制时的语义:按 Vixie cron 标准是「或」而不是「且」,所以 0 0 13 * 5 表示「13 号或周五」都会执行,而不是「13 号且是周五」。执行时间按服务器本地时区计算,跨时区部署时需先确认容器或系统的时区设置。
这个工具解决你的问题了吗?
提交后会把工具名、你的输入与当前结果发送到服务器;请勿填写身份证号、手机号等隐私信息。
AI 助手 会结合你当前的输入与结果回答
追问会再次把当前输入与结果发送到服务器;请勿填写隐私信息。
使用步骤
- 按「分 时 日 月 周」顺序填写五段表达式,例如每天 0 点是 0 0 * * * 。
- 不确定字段含义时先只填一段,看下方逐字段的人话解读核对。
- 对照「接下来 5 次执行时间」验证是否符合预期,特别留意月末与跨月场景。
- 需要「工作日执行」用 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 表示开机时执行一次,没有固定时间点,无法计算「下次执行时间」,因此不在解析范围内。
延伸阅读
来自本站原创文章,讲清这个工具背后的算法与口径。