Cron 表达式

解释 Linux、Spring 或 Quartz 的 cron,也可以按字段生成,并按这台电脑的本地时间列出接下来 10 次运行。 生成 Crontab

生成 Crontab

各字段

这条计划什么时候跑

可选 Linux Crontab(5 位)、Spring @Scheduled(6 位,秒在最前)或 Quartz(6 位,也可以再加年)。页面逐段解释,并按这台电脑的时钟列出接下来 10 次运行。不会把任务装进系统。若要按每天几点,或 @daily 这种写法来生成,用 Cron 表达式生成器。时间戳用 Unix 时间戳。

怎么用

  1. 格式选 Linux Crontab(5 位)、Spring @Scheduled(6 位)或 Quartz(6–7 位)。菜单下面那一行写着字段顺序,以及哪个数字是周日。
  2. 直接写表达式,打开预设,或改「各字段」里的每一行。预设里有每分钟、每小时、每天零点、每周日零点、工作日 9 点到 17 点,每 15 分钟,以及每月 1 日零点。输入框下面的按钮会按当前格式载入这些预设,另外还有每天 02:00、周末 09:00、从第 5 分起每 15 分、每 2 小时的第 30 分,以及每年 1 月 1 日。Spring 和 Quartz 还有每月最后一天 23:00、最接近 15 日的工作日、第一个周一 10:15,以及最后一个周五 10:15。Quartz 还有 2030 年 1 月 1 日。按钮旁边的链接打开 Cron 表达式生成器。每一行都有:每、范围、间隔、指定。选「指定」才列出具体值:秒和分是 0–59,时是 0–23,日是 1–31,月是 1–12,星期是 SUN–SAT。Spring 和 Quartz 还有:不指定(?)、最后一天(L)、最后一个工作日(LW)、最近的工作日(W)、第几个星期几(#)、最后一个星期几(nL)。改字段会重写表达式。某一段无法用这些模式表示时,这一行停在「自定义」,原文保留。
  3. 「边输入边更新」默认开着。「解释」只跑一次。「显示示例」按当前格式填入工作日示例:Linux */15 9-17 * * 1-5,Spring 0 */15 9-17 * * MON-FRI,Quartz 0 */15 9-17 ? * MON-FRI。
  4. 结果先写出每一段,再列出「接下来 10 次运行」。「全部清除」清空表达式和结果,并把每个字段设回「每」。「复制结果」复制这段文字。切换格式会补上或去掉秒;在 Linux 里把 ? 换成 *;把星期数字改成 SUN–SAT,让同一批星期保持不变。

哪些日期会命中

Linux 是分、时、日、月、星期。周日是 0、7 或 SUN,周一是 1。没有 ?、L、W、#。日和星期都做了限制时,两边有一边符合即可,结果里会写明。

Spring 在最前面加秒。周日编号和 Linux 相同。? 表示这一位不看。L 是当月最后一天。15W 是离 15 号最近的工作日,不会跨出这个月。LW 是当月最后一个工作日。MON#1 是第一个周一。6L 是最后一个周六,因为这里的 6 是周六。

Quartz 同样是这六位,年可以写成 2024-2030。周日是 1 或 SUN,周一是 2,周六是 7。6L 是最后一个周五。日和星期里应有一个是 ?,例如每天凌晨 2 点写作 0 0 2 * * ?。如果两边都写了具体值,页面仍按「有一边符合就运行」列出时间,并给出警告。SUN–SAT 和 JAN–DEC 不区分大小写,三种格式里表示同一天、同一个月。

连字符是范围,逗号是列举,斜线是步长。*/15 从该段的起点每隔 15。5/15 从 5 开始每隔 15 直到该段结束,所以分钟是 5、20、35、50。时间是本地时间,不是 UTC。有秒这一位时按秒推进,否则按分钟推进。

会用在什么地方

  • 写进 crontab 之前核对 0 2 * * *。
  • Spring 每天凌晨 2 点写成 0 0 2 * * *。
  • 核对 Quartz 的 0 15 10 ? * 6L(每月最后一个周五 10:15)或 0 0 23 L * ?(每月最后一天 23:00)。

常见问题

为什么凌晨 2 点在 Linux 是 5 段,在 Spring 是 6 段?

Linux 没有秒,所以是 0 2 * * *。Spring 和 Quartz 把秒放在最前,同一时刻是 0 0 2 * * *;Quartz 常写成 0 0 2 * * ?。

问号是什么意思?

表示这一位不指定。Quartz 要求日和星期里有一个是 ?。0 0 2 * * ? 是每天凌晨 2 点。

1 是周日吗?

Linux 和 Spring 里 1 是周一,周日是 0 或 7。Quartz 里 1 是周日,2 是周一。三种格式里 SUN 都是周日。

时钟和 UTC 对不上。

接下来 10 次运行用的是这台电脑的本地时区。