这个工具做什么
Cron 表达式生成器把「写定时任务」这件事变回可视化:每个字段单独选,表达式实时拼出来,旁边直接告诉你它是什么意思、接下来五次什么时候跑。
它同时支持两套语法——Linux crontab 的 5 段(分 时 日 月 周)和 Quartz / Spring @Scheduled 的 6 段(最前面多一位「秒」)。这两套最容易混淆的不是段数,而是「日」和「周」的关系:Linux 里两者同时限制是「或」,Quartz 里用 ? 表示不指定、两者是「与」。本工具按各自规范分别实现。
除了生成,它也支持反向:把线上正在跑的那条表达式粘进来,立刻翻译成人话并算出下次执行时间——排查「为什么任务没跑」时这一步最有用。
如何使用
- 先选方言 crontab、多数 Linux 计划任务用 5 段;Java 的 Quartz、Spring 的 @Scheduled(cron = ...) 用 6 段。选错了段数,表达式在任何一边都跑不起来。
- 逐字段选或直接改 每个字段都有常用预设(每 5 分钟、整点、工作日、月末……),点一下就填进去;也可以直接在输入框里写 1-30/2 这种精确写法。字段下方会实时回显它的含义,写错立刻标红。
- 看下次执行时间再复制 「这个表达式什么时候跑」给出接下来五次执行时间——这是最省事的自检方式:如果列表是空的,说明日与月互相矛盾(比如 2 月 30 日)。确认无误后复制表达式,或下载一份 .txt 报告留档。
常见问题
5 段和 6 段到底差在哪?
只差最前面一位「秒」。Linux crontab 是「分 时 日 月 周」,Quartz 是「秒 分 时 日 月 周」。把 5 段的表达式直接贴进 Quartz 会被当成「秒=分」而错位,所以一定要先选对方言。
为什么「每月 1 号」还会在周一跑?
因为 Linux cron 在「日」和「周」都被限制时取「或」,不是「与」。要只按日期跑,把「周」写成 *;要只按星期跑,把「日」写成 *。Quartz 则用一个 ? 把不关心的那一项留空。
下次执行时间是空的怎么办?
说明这个组合在接下来 8 年里不存在。最常见的是日期越界(2 月 30 日、4 月 31 日),其次是「日」和「周」互相锁死。先确认月份的天数,再把其中一个改成 * 试试。
支持 W、#、英文缩写吗?
不支持,而且不会假装支持——这些写法会被明确报错。原因是个平台实现差异很大(W 在 Quartz 与部分 Linux 实现里行为不同),含糊支持比不支持更危险。月份与星期请用数字。
时间按哪个时区算?
按你浏览器的本地时区。如果你的服务器在别的时区(或容器里是 UTC),实际触发时间会和这里显示的不一样——部署前记得核对服务器时区,夏令时切换那天尤其容易差一小时。
表达式会被上传吗?
不会。解析、解释与时间计算全在浏览器内完成,页面没有任何上传请求。表达式里可能带上业务信息(比如特定日期),本地处理更省心。
限制与边界
只支持 * 数字 逗号 区间 步长,以及 Quartz 的 ? 与 L;不支持 W、#、英文缩写与年份段。
只按浏览器本地时区计算,不做时区换算;夏令时切换日可能与服务器实际触发时间相差一小时。
不校验业务合理性(例如「每 5 分钟跑一次」是否会压垮数据库),只校验语法与时间是否存在。