首页 > 编程笔记 > Java笔记 阅读:23

SpringBoot Cron表达式的用法(新手必看)

Cron 表达式是一个字符串,结构非常简单。Cron 表达式从左到右分为 6 或 7 个字段,每个字段代表一个含义,用空格隔开。

小时 日期 星期 年(可选)
*/5 * * * * * ?

Cron 表达式主要由秒、分、小时、日期、月份、星期、年份 7 个字段构成,其中年份可选。示例中的 Cron 表达式“*/5 * * * * ?”表示每 5 秒执行一次。

Cron 表达式中各个字段的含义、允许值和使用规则如下表所示:

表:Cron 表达式中各个字段的说明和规则
字段 允许值 说明
秒(Seconds) 0~59的整数 、、*、四个字符
分(Minutes) 0~59的整数 、、*、四个字符
小时(Hours) 0~23的整数 、、*、?、/、L、W、C八个字符
日期(DayofMonth) 1~31的整数(但是需要考虑当月的天数) 、、*、四个字符
月份(Month) 1~12的整数或者 JAN-DEC 、、*、四个字符
星期(DayofWeek) 1~7 的整数或者 SUN-SAT(1=SUN) 、、*、L、C、#八个字符
年份(可选,Year) 1970~2099 、、*、四个字符

表中 Cron 一共有 7 位,最后一位是年份,可以留空。因此,一般我们可以写 6 位。另外,第 6 位星期(DayofWeek)的取值范围为 1~7,从星期日(SUN)开始。

Cron表达式特殊字符说明

Cron 表达式的时间字段除了允许设置数值外,还可以使用一些特殊的字符,提供列表、范围、通配符等功能,说明如下:

特殊字符 含义和作用
* 表示字段中的“每个”,比如在 Minutes 字段中,* 表示每分钟。
? 用在 DayofMonth 和 DayofWeek 字段中,表示“没有指定值”。这对于需要指定一个或者两个字段的值,而不需要对其他字段进行设置来说相当有用。例如,想在一个月的某一天(比如第 10 天)执行某项任务,而不在乎具体是哪一天,就可以把“10”放在 DayofMonth 字段,然后把“?”放在 DayofWeek 字段。
- 指定范围,例如,“10-12”在 Hours 字段中表示“10点到12点”。
, 指定附加值,例如,“MON,WED,FRI”在 DayofWeek 字段中表示“星期一、星期三和星期五”。
/ 用于指定值的增量,例如,“0/15”在 Seconds 字段中表示“从0开始,每隔15秒”。
L 只用在 DayofMonth 和 DayofWeek 中,这个字符是“Last”的简写,但是在两个字段中的意义不同。例如,在 DayofMonth 字段中,“L”表示本月的最后一天,即 1 月的 31 日,非闰年的 2 月 28 日。如果它用在 DayofWeek 中,则表示“7”或者“SAT”。但是,如果这个字符跟在别的值后面,则表示“当月的最后的周XXX”,如“6L”或者“FRIL”都表示本月的最后一个周五。同时,也可以用来指定第某个月的最后一天的倒数第几天,如“L-3”表示某月最后一天的倒数第三天。注意:当使用“L”选项时,重要的是不要指定列表或者值范围,否则会导致混乱。
W 用于 DayofWeek 字段中,指定给定日(星期一到星期五)最近的一天,如“15W”表示“距离月中15日最近的工作日是周几”。
# 表示本月中的第几个周几,如 DayofWeek 字段中的“6#3”或者“FRI#3”表示“本月中第三个周五”。

Cron 表达式复杂难懂的地方就是这些特殊字符。只有熟悉了这些特殊字符的含义和作用,才能彻底了解 Cron 表达式。

常用的Cron表达式

Cron 表达式看起来晦涩难懂,但是只要明白了字段和通配符的含义,就能一眼看出表达式的触发执行规则。

下面给出一些常用的 Cron 表达式,基本上可以拿来即用,详细的表达式说明见下表。

Cron 表达式 说明 Cron 表达式 说明
0 0 2 1 * ? * 在每月1日的凌晨2点执行 0 * 14 * * * ? 在每天 14 点到 14:59 期间,每分钟执行一次
0 15 10 ? * MON-FRI 周一到周五每天上午10:15执行 0 0/5 14 * * ? 在每天 14 点到 14:55 期间,每 5 分钟执行一次
0 15 10 ? 6L 2002-2006 2002~2006 年每个月的最后一个星期五上午 10:15 执行 0 0/5 14,18 * * ? 在每天 14 点到 14:55 期间和 18 点到 18:55 期间,每 5 分钟执行一次
0 0 10,14,16 * * ? 每天上午 10 点、下午 2 点和 4 点执行 0 0-5 14 * * ? 在每天 14 点到 14:05 期间,每分钟执行一次
0 0 12 ? * WED 每个星期三中午 12 点执行 0 15 10 ? * MON-FRI 周一至周五的上午 10:15 执行
0 0/30 9-17 * * ? 每天 9 点到 17 点每半小时执行一次 0 15 10 15 * ? 每月 15 日上午 10:15 执行
0 15 10 ? * * 每天上午 10:15 执行 0 15 10 L * ? 每月最后一日的上午 10:15 执行
0 15 10 * * ? 2005 2005 年的每天上午 10:15 执行 0 15 10 ? * 6#3 每月的第三个星期五上午 10:15 执行

如上表所示,Cron 表达式支持一些范围或列表,如子表达式“天(星期)”可以为“MON-FRI”、“MON,WED,FRI”、“MON-WED,SAT”,即设置时间范围。这正是 Cron 表达式的灵活、强大之处。

相关文章