Cron 表达式
在进行定时任务的创建的时候,cron是计划任务的表达式
本文意在快速的分析列出cron表达式的书写规则与含义
1、基本格式
cron表达式格式:
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
-
六位的
0 0 12 * * ?
(每天的中午12点触发)Seconds Minutes Hours DayofMonth Month DayofWeek
-
七位的
0 0 12 * * ? *
(每天的中午12点触发)Seconds Minutes Hours DayofMonth Month DayofWeek Year
简单解释下以六位(常用)的为例
0 0 12 * * ?
中的六位,分别对应Seconds Minutes Hours DayofMonth Month DayofWeek
数字 | 对应位 | 含义 |
---|---|---|
0 | Seconds(秒) | 第0秒 |
0 | Minutes(分) | 第0分 |
12 | Hours(时) | 12时(24小时制) |
* | DayofMonth(一个月的第几天) | 一个月的每一天 |
* | Month(月) | 每一个月 |
? | DayofWeek(周几) | 一周中的每一天 |
整体来看就是每天的12:00进行任务触发,这种是最简单最易理解的一种形式。
要注意的是,在 秒 分 时
后边跟的是 一个月的第几天
而非 月
记忆的时候注意别搞混,还有DayofWeek
的取值定义,不同处有不同定义,要先确认1
代表周一还是周日
其中的*
、?
二者都是每一天的意思,但又有使用上的区别,下边会进行详细解释。
2、一些特殊值的含义
每个位除了数字和
*
外还有其他的可选值,学习特殊字符的含义是用好Cron表达式的基础
四种通用特殊字符
特殊符号 | 用法 | 例子 |
---|---|---|
* | 匹配该域的任意值 | Minutes域使用*, 即表示每分钟都会触发事件 |
- | 表示范围 | Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 |
/ | 表示数值的增量 | Minutes写上0/5表示从0分开始,每隔5分钟 |
, | 表示列出枚举值 | Minutes域使用5,20,第5分钟和第20分钟分别触发 |
五种有使用限制的特殊字符
限制字符指的是只能在固定的几个域使用,主要用于满足一些特殊场景
?
含义: 匹配该域的任意值
限制:只能用在DayofMonth和DayofWeek两个域
特殊解释:分析Cron表达式,可以发现 DayofMonth
和DayofWeek
是会进行冲突的,比如要实现这样一个表达式,去表达每周五下午六点,要怎么表示,核心在于 DayofMonth
怎么去标识,写具体值不合适,写*
就变成了每一天,和每周五出现了冲突。这时就用 ?
表达一种次要通配,辅助*
进行含义的表达,0 0 18 ? * 6
,表达是 0秒,0分,18时,一个月的任意一天,每个月,没周五。
例子参考理解:
- “0 15 10 ? * *” 每天上午10:15触发
- “0 15 10 * * ?” 每天上午10:15触发
- “0 15 10 ? * 2-6” 周一至周五的上午10:15触发
- “0 15 10 15 * ?” 每月15日上午10:15触发
L
含义:表示最后,
限制:只能出现在DayofWeek和DayofMonth域
解释:如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。在DayofMonth用L,意味当前月的最后一天
例子参考理解:
- “0 15 10 L * ?” 每月最后一日的上午10:15触发
- “0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
W
含义:表示有效工作日(周一到周五),
限制:只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。
特殊解释:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份
LW
含义:表示在某个月最后一个工作日,即最后一个非周六周末的日期。
限制:只能出现在DayofMonth域
#
含义:用于确定每个月第几个星期几
限制:只能出现在DayofWeek域
补充解释:4#2,表示某月的第二个星期三。
例子:
- “0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
3、各个域的取值范围
取值范围 | 允许的特殊字符 | 是否必填 | 备注 | |
---|---|---|---|---|
秒-Seconds | 0~59的整数 | , - * / 四个字符 | 是 | |
分钟-Minutes | 0~59的整数 | , - * / 四个字符 | 是 | |
小时-Hours | 0~23的整数 | , - * / 四个字符 | 是 | |
日期-DayofMonth | 1~31的整数(但是你需要考虑你月的天数) | , - * / ? L W C 八个字符 | 是 | ?LW只有部分软件实现了 |
月份-Month | 1~12的整数 或者 JAN-DEC | , - * / 四 个字符 | 是 | |
星期-DayofWeek | 1~7的整数 或者 SUN-SAT | , - * / ? L C # 八个字符 | 是 | ? L #只有部分软件实现了, Linux 和 Spring 的允许值为0-7,0和7为周日;Quartz的允许值为1-7,1为周日 |
年-Year | 1970~2099 | , - * / 四个字符 | 否 | 标准实现不支持此字段。 |
使用的时候还是需要查询具体的软件实现,来确认一些域的具体取值范围。