Cron 解析
计算Cron 表达式在线解析与下次执行时间
Cron 表达式看着只有几个数字和星号,却是运维和后端最容易写错的一行配置:位置挪错一格,任务就可能从每天一次变成每分钟一次。更麻烦的是反馈周期太长,改完往往要等到下一个触发点才知道对不对。
这个页面做两件事——把表达式翻译成中文,以及直接列出接下来的若干次触发时刻。后者比释义更能暴露问题:如果你想要「每天中午 12 点」,而列表里出现的是连续的每一秒,一眼就能看出秒位错写成了 *。
段数是最常见的混淆点。Linux crontab 是 5 段(分 时 日 月 周),Quartz 和 Spring 的 @Scheduled 是 6 段,最前面多一个秒字段。把 0 0 12 * * ? 直接贴进 crontab,或者把 0 12 * * * 贴进 Quartz,得到的都会是与预期完全不同的结果。工具会按空格数自动识别,也可以手动锁定段数来验证自己的判断。
触发时间按浏览器的本地时区推算。如果服务器跑在 UTC 而你本机是 UTC+8,页面上看到的时刻需要平移 8 小时才对应服务器上的真实执行时间——这也是定时任务「时间不对」最常见的原因之一。
侧栏的常用预设可以直接点选套用,字段说明列出了每一段的取值范围,包括周字段的两种写法。表达式的释义和时间推算都在浏览器内完成,不会发送到任何服务器。
功能一览
- 中文释义:把表达式翻译成「每隔 5 分钟」「工作日 09:00」这类可读描述,统一使用 24 小时制
- 下次触发时间:按本地时区列出接下来 1 到 20 次执行时刻,每条附对应的 ISO 8601 UTC 时间
- 段数自动识别:按空格数量判断 5 段(分 时 日 月 周)与 6 段(秒 分 时 日 月 周),也可手动锁定段数;7 段(含年)可给出释义
- 输入容错:自动折叠多余空格、去掉首尾引号,表达式段数与所选模式不一致时会明确提示
- 常用预设:内置每分钟、每 5 分钟、每小时整点、每天 0 点、工作日 9 点、每月 1 号、每 10 秒等十个模板
- 字段速查:侧栏列出每个字段的取值范围,包括周字段的 0–7 与 SUN–SAT 两种写法
- 剪贴板粘贴:一键把剪贴板中的表达式填入输入框,便于从配置文件或日志里直接拷来核对
- 本地解析:释义与时间推算全部在浏览器内执行,表达式不上传,页面加载后断网仍可使用
常见问题
- Cron 表达式的 5 段和 6 段怎么区分?
- 数一下用空格分隔的字段数量即可。5 段是 Linux crontab 的标准写法,从左到右依次是分、时、日、月、周,最小粒度为分钟;6 段是 Quartz 与 Spring 的写法,在最前面多一个秒字段,变成秒、分、时、日、月、周。所以 0 0 12 * * ? 只有按 6 段理解才是「每天 12 点整」,当成 5 段则完全不成立。本工具默认自动识别段数,也可手动锁定,段数与所选模式不符时会提示。
- Cron 里的 ? 和 * 有什么区别?
- 标准 Linux crontab 里没有 ? 这个字符,只有 * 表示该字段取全部值。? 是 Quartz 引入的,只能用在「日」和「周」两个字段上,含义是「不指定」,因为这两个字段互相冲突,Quartz 要求其中一个必须让位。实际效果上,0 0 12 * * ? 与 0 0 12 ? * * 通常和把 ? 换成 * 一致。本工具推算触发时间时正是把 ? 统一按 * 处理,中文释义则保留原写法。
- Cron 的星期字段是从 0 还是从 1 开始?周日怎么写?
- 本工具的周字段接受 0 到 7,其中 0 和 7 都表示周日,1 到 5 依次是周一到周五,6 是周六;也可以直接写 SUN、MON 一直到 SAT,大小写不敏感,工作日写成 1-5 或 MON-FRI 都可以。需要提醒的是 Quartz 官方定义里 1 表示周日、7 表示周六,与 Linux crontab 整体相差一位。如果表达式要贴进 Quartz 运行,务必按目标系统文档再核对周字段。
- */5 这种写法是什么意思?每 5 分钟应该怎么写?
- 斜杠是步长语法,*/5 表示在该字段的取值范围内每隔 5 个单位触发一次。5 段的 */5 * * * * 就是每 5 分钟一次;6 段等价写法是 0 */5 * * * *,秒位必须写 0,否则写成 * */5 * * * * 会变成那一分钟内每秒都触发。同理 */10 * * * * * 每 10 秒一次。步长也可配合区间,例如分钟字段写 0-30/5,表示只在每小时前半小时每 5 分钟触发。
- L、W、# 这些特殊字符支持吗?
- 支持程度需要分成两部分看。中文释义能解读 Quartz 的整套扩展,包括 L(月末,或某月最后一个星期几,如 FRIL、1L)、#(某月的第几个星期几,如 6#3 表示第三个星期六)以及 W(最接近的工作日,如 15W、LW)。而下次触发时间的推算能处理 L 和 #,但不支持 W,因此含 15W 或 LW 的表达式只会显示释义,时间列表处会提示推算失败。
- 显示的触发时间是哪个时区的?7 段带年份的表达式支持吗?
- 触发时间按你浏览器所在的本地时区计算和显示,每条下方另附 ISO 8601 的 UTC 时间便于核对。要注意服务器上的 crontab 走的是服务器时区,如果服务器在 UTC 而你本机是 UTC+8,实际执行时刻会相差 8 小时,这是排查「定时任务没按点跑」时最常见的原因。至于 7 段(秒 分 时 日 月 周 年)表达式,可以得到中文释义,但触发时间推算目前不支持年字段,会提示推算失败。