Cron表达式介绍
cron 表达式本质上就是一个字符串,该字符串由 6
个空格分为 7
个域,每一个域代表一个时间含义。
通常定义 “年” 的部分可以省略,所以表达式常见形式是6
个域。
根据“年”的部分是否省略,cron表达式通常有一下两种格式:
{秒} {分钟} {小时} {日期} {月份} {星期}
{秒} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
记忆:秒分时天月周
下面说一下每个位置允许的值,以及一些案例,足够我们掌握cron表达式。
域 | 允许出现的值范围(都是整数) | 允许出现的字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
时 | 0-23 | , - * / |
日期 | 1-31 | , - * / ? L C W |
月 | 1-12 或者使用英文JAN-DEC | , - * / |
星期 | 1-7 或者使用英文SUN-SAT | , - * / ? L C # |
年(可选) | 1970-2099 | , - * / |
星期
(周)域中 1 代表星期日,7 代表星期六;如果使用英文的话,周一至周日分别是:MON、TUES、THUR、FRI、SAT、SUN。
要么只规定日期,要么只规定星期,两者基本上不会同时规定的。
允许出现的字符含义
以下 4 个字符可以出现在所有域中:
,
表示列出枚举值,符号前和符号后是递增的值。例如:在分
域使用5,20
,则意味着在5分和20分的时候各触发一次,总共两次。-
表示范围,例如在分
域使用5-20
,表示从第5分钟到第20分钟每分钟触发一次*
表示该域允许范围中的所有值。假如在分
域使用*
, 即表示每分钟都会触发事件。/
符号前表示开始时间,符号后表示每次递增的值,表示从符号前时间开始,每隔多长时间触发一次。例如在秒
域使用5/13
,则意味着从第5秒开始触发一次,然后在此分钟内每隔13秒触发一次(意味着下一分钟会重新从第5秒开始),其他域中使用时过程相同。
下面是特殊的字符:
-
?
表示没有说明的值,不关心该字段的值(满足其他域指定的条件就会触发)。只能用在日期和星期两个域,这两个域会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法:13 13 15 20 * ?
其中最后一位只能用?
表示不关心是周几。*
表示允许的所有值,实际上等于将所有有效值都列上,如果将上面的?
改成*
,意思就是星期内的每一天,这就会和指定的日期是冲突的,所以星期和日期,两者只能指定一个)。?
也不能同时出现在这两个域中,而且两个域中必须指定一个。
-
L
表示最后,只能出现在日期
和星期
域。单独使用时,表示最后。例如在
日期
域中使用,表示这个月最后一天;在星期
域中使用表示这个月的每周六。除此之外,用在
星期
域中时,还可以搭配数字,表示这个月的最后一个周几。例如1L
,表示这个月的最后一个周日。 -
W
表示有效工作日(周一到周五),只能出现在日期
域。系统将在离指定日期的最近的有效工作日触发事件- 例如:在 日期域 使用
5W
,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。 - 另外一点,W的最近寻找不会跨过月份,例如 2023年4月30日是周日,指定
0 0 0 30W 4 ? 2023
,则它会在4月28日执行。 LW
:表示这个月的最后一个工作日。
- 例如:在 日期域 使用
-
#
只能用在星期
域上。符号前面数字表示周几,后面数字表示第几个,用来指定某个月的第几个星期几。例:在星期字段中用"1#2"指这个月第2个周日(1指周五,2指第2个)。如果指定的日期不存在,触发器就不会触发。
可以搜在线cron网站,对cron表达式进行校验或者查看运行时间。
【END】