一、概述

当需要计划按照较为复杂的时间设定进行执行,且无法通过“新建计划”界面简单配置实现时,可以通过设置Cron表达式实现。


二、CRON表达式规则

1、基本结构

Cron表达式是一个字符串,由6或7个时间字段组成,各字段以空格分隔,格式如下:

示例格式:​


2、字段含义与取值范围

字段

允许值

允许的特殊字符

备注

0-59

, - * /

控制秒级触发

0-59

, - * /

控制分钟级触发

0-23

, - * /

控制小时级触发

1-31

, - * ? / L W C

1)控制每月具体某天。

2)需要注意一些特别的月份。

1-12 或 JAN-DEC

, - * /

控制月份

1-7 或 SUN-SAT (1=周日)

, - * ? / L C #

1)控制每周某天

2)有些系统可能:1=周一

年 (可选)

1970-2099

, - * /

控制年份


3、特殊字符含义

字符含义
*(通配符)表示匹配该字段的所有值。例如:在"分"字段使用*表示每分钟。
?(不指定值)用于日和周的冲突解决(只能指定其中一个)。因为"日"和"周"会相互影响,所以其中一个指定值后,另一个必须用 ? 占位。比如,指定每月15号执行时,"周"字段就要用?;指定每周一执行时,"日"字段就要用?。例如: 0 0 12 15 * ? 表示每月15号12点执行;0 0 12 ? * MON 表示每周一12点执行。
/(间隔)定义步长。例如 0/15 * * * * ? 表示从第0秒开始,每15秒执行一次。
-(范围)指定连续时间范围。例如 0 0 9-17 * * ? 表示每天9点到17点每小时执行一次。
,(枚举)列举多个值。例如 0 0 1,13,18 * * ? 表示每天1点、13点、18点执行。
L(最后,Last)
  • 在"日"字段表示月份的最后一天。

  • 在"周"字段表示"7"或"SAT"(周六)。

  • 结合数字表示某月的最后一个星期几(如"6L"表示某月最后一个周五)。

W(工作日,Weekday)在"日"字段中,表示离指定日期最近的工作日。例如 15W 若15号是周六,则触发14号(周五)。
#(第几周)星期字段中,表示某月第几个星期几。例如 6#3 表示每月的第三个星期五。
C(日历,Calendar)很少使用。

4、注意事项

1)日与星期字段

必须至少一个设为 ?,否则冲突。例如 0 0 12 1 * ? 表示每月1日中午12点,不指定星期。


2)星期字段的数值含义

Quartz中 1=周日,依此类推,7=周六,而部分系统可能 1=周一,需注意环境差异。


3)年字段

年字段是可选的,通常可以省略。范围1970-2099,通常用于特定年份的调度。


4)闰年与月末处理

例如 0 0 0 29 2 ? 仅在闰年2月29日触发。


5)表达式不区分大小写

"MON"与"mon"效果相同


三、常见示例

需求CRON表达式
每天中午12点触发0 0 12 * * ?
每周一至周五上午9:30触发0 30 9 ? * MON-FRI
每月1号上午10:15触发0 15 10 1 * ?
每5分钟触发一次0 0/5 * * * ?
每天上午9点到下午5点,每隔半小时触发0 0/30 9-17 * * ?
每月最后一天晚上11点触发0 0 23 L * ?
每月的最后一个周五上午10:15触发0 15 10 ? * 6L
每年1月的第2个周日早上9点触发0 0 9 ? 1 1#2


四、CORN表达式生成器

可以使用 Cron 在线生成器生成表达式。例如:https://calctools.online/zh/time/cron#quartz