cron表达式介绍
cron表达式的位数
cron表达式有5位 (Linux中的crontab命令中就是5位)、6位、7位之分,不同位数之间以空格分隔
位数 每位的含义
5位:* * * * * 分、时、天、月、周
6位:* * * * * * 秒、分、时、天、月、周
7位:* * * * * * * 秒、分、时、天、月、周、年
在大部分情况下会省略年这一位,成为6位,再省略秒,就成为5位。
注意:
1:Linux中的crontab表达式只有5位
2:从Spring3.0的版本后,cron表达式只能支持6个字段,也就是不支持年份的表达式
常见的特殊符
*:匹配该域的任意值
-:表示范围
例如:
0 0 9-17 * * * 每天朝九晚五时间内的0分0秒触发
/: 时间间隔,用来指定数值的增量。
a/b表示从a开始每隔时间b,例如:5/10 * * * * * 表示每一分钟的5秒、15秒、25秒… 触发。
在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟。
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
,:枚举值
例如:0 0 9,18 * * ? 在每天9点和下午6点整触发
? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为? 字符是 “我并不关心在该域上是什么值。” 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。
不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了WED。那么是要 trigger 仅在每个月的11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。
只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
例子
以5位的cron表达式举例:
0 8 * * * 每一天的8点执行任务
0 0-8 * * * 每一天0-8点每小时执行一次任务
0 0-8/2 * * * 每一天0-8天每2小时执行一次任务
0 0,2 * * * 每一天0点和2点执行一次任务