怎么用
- 在输入框里粘贴 cron 表达式,或点下面的常用写法。支持标准的 5 段写法,也支持很多任务框架使用的 6 段写法(最前面多一段「秒」),以及 @daily、@hourly 这类简写。
- 选择时区。默认是你电脑的时区;服务器上的 cron 通常按服务器所在时区(很多是 UTC)运行,看运行时间之前先确认这一点。
- 看结果:第一行是一句话的解释,下面的表格列出每一段实际代表哪些值,最后是接下来几次运行的时间,以及距离现在多久。
cron 表达式的规则
五个字段
按 crontab(5) 手册,五个字段依次是:分钟(0–59)、小时(0–23)、日(1–31)、月(1–12)、星期(0–7,0 和 7 都表示周日)。月份和星期也可以写英文前三个字母,例如 jan、mon,大小写不限。每个字段可以写 * 表示全部,用逗号列出多个值(1,15),用短横线写范围(1-5,起点不能大于终点),用斜杠写步长:*/15 表示每 15 个,0-23/2 表示 0 到 23 里每隔一个。@yearly、@monthly、@weekly、@daily、@hourly 分别等于 0 0 1 1 *、0 0 1 * *、0 0 * * 0、0 0 * * *、0 * * * *。
最容易出错的地方:日和星期是「或」
POSIX 规范规定,当「日」和「星期」都写了具体值时,只要其中一个匹配就运行。手册里的例子 30 4 1,15 * 5,意思是每月 1 号和 15 号的 4:30,外加每个周五的 4:30,而不是「恰好是周五的 1 号或 15 号」。很多人想写「每月第一个周一」,写成 0 9 1-7 * 1,结果变成了每月 1 到 7 号每天都跑、外加每个周一。
还有一个更少人知道的细节:手册里说的「写了具体值」,是指字段不含 * 字符。所以 */2 这种以星号开头的写法不算,这时两个字段要同时满足。0 0 */2 * 1 的意思是「单数日并且是周一」。本工具按这套规则计算,遇到这两种情况都会在结果上方提醒。
时区和夏令时
cron 按运行它的机器上的时间来匹配。手册指出,夏令时调整时,被跳过的那个小时里的任务不会运行,重复出现的那个小时里的任务会运行两次。如果服务器所在的时区实行夏令时,排在凌晨切换时段的任务要特别留意。本工具在所选时区的挂钟时间上计算,不对夏令时做特殊处理。
6 段写法
Spring 的定时任务用 6 段写法,在最前面多一段「秒」,星期同样是 0–7(0 和 7 都是周日),日和星期字段可以用 ? 代替 *。本工具在输入 6 段时按这个规则解析,也接受 ?。
要特别小心 Quartz:它的星期字段是 1–7,而且 1 表示周日、2 才是周一,和 Unix cron 差了一位;它还有可选的第 7 段「年」,以及 L(最后一天)、W(最近的工作日)、#(第几个星期几)这些扩展。把 Quartz 表达式贴到这里,星期的解释会差一天,请按 Quartz 的规则自己换算。
示例
以 2026 年 9 月 30 日(周三)10:07 为起点:
| 表达式 | 含义 | 接下来的运行时间 |
|---|---|---|
| */15 * * * * | 每 15 分钟 | 10:15、10:30、10:45 |
| 0 9 * * 1-5 | 周一到周五 09:00 | 10 月 1 日、10 月 2 日、10 月 5 日(跳过周末) |
| 30 4 1,15 * 5 | 每月 1、15 号,以及每周五,04:30 | 10 月 1 日、2 日(周五)、9 日(周五)、15 日 |
| 0 0 */2 * 1 | 单数日且周一 | 10 月 5 日、10 月 19 日、11 月 9 日 |
| 0 12 29 2 * | 2 月 29 日 12:00 | 2028 年 2 月 29 日、2032 年 2 月 29 日 |
0 0 30 2 * 永远不会运行,因为 2 月没有 30 号,工具会直接提示。0 0 31 * * 只会在有 31 号的月份运行,所以从 10 月 31 日之后,下一次是 12 月 31 日。
局限
- 不支持 Quartz 的 L、W、# 扩展和第 7 段「年」,也不支持 cronie 的 ~ 随机范围。Quartz 的星期编号(1 = 周日)与这里不同。
- 5/15 这种「从 5 开始每 15」的写法很多实现都接受,本工具也按这个意思解析,但并不是所有 cron 都支持。
- 运行时间按所选时区的挂钟时间计算,夏令时切换当天的跳过和重复不做特殊处理。
- 只计算表达式本身。实际是否运行还取决于 cron 服务是否在跑、机器是否开着、任务有没有设置其他条件。
常见问题
0 9 * * 1-5 是什么意思?
周一到周五每天 9:00 运行。
星期日是 0 还是 7?
都可以。按 crontab(5) 手册,0 和 7 都表示周日。
为什么同时写了日和星期,任务跑的次数比预想多?
两者都写具体值时是「或」的关系,满足任意一个就会运行。
6 段的 cron 表达式是什么?
Spring 等框架在最前面加了一段「秒」,例如 0 */5 * * * * 表示每 5 分钟的第 0 秒。
cron 按哪个时区运行?
按运行它的机器的系统时区,很多服务器是 UTC。用本工具的时区选项切换查看。