在做spring的定时任务的时候,关于cron表达式中的* 和 ?这两个字符一直都分不太清,所以这次重点写一下。
cron 表达式的组成: 秒 分 时 天 月 周 年
最后一个年一般都省略了,所以我们平时用的cron一般是6个部分使用.
* 表示每一个,这cron中的7个位置都可以用,例如如果用在秒的位置,表示每秒。
?表示不关心当前位置的值,所以常翻译为任意,但是使用位置只能在天和周,例如如果天的位置设置了具体值,周的位置也设置了具体值,那就具体到星期几了,意思就是几号星期几,这样同时满足这样的条件日期就很少了,具体举例是:2号星期四,既是2号又是星期四,所以一般天和周的位置有一方设置为?,表示不关心当前位置的值。
位置 | 允许的值 | 允许的符号 |
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
时 | 0-23 | , - * / |
天 | 1-31 | , - * / ? L W C |
月 | 1-12 | , - * / |
周 | 1-7 | , - * / L C # |
年 | 不填或者1970-2099 | , - * / |
, 表示多个值,例如秒的位置1,2表示第一秒和第二秒
- 表示一个区间,例如秒的位置1-3表示第一秒到第三秒
/ 上面的值表示起始位置,下面的值表示间隔值,例如秒的位置2/3表示从第二秒开始间隔三秒执行一次
L 表示最后,作用在天的位置表示当月的最后一天,作用在周的位置,就表示星期六
W 这个必须结合数字一起使用,例如12W,表示当月具体前面数字最近的工作日触发,所以这个参数只能作用于天的位置。
# 格式是a#b,表示第几个星期几,例如2#3表示第三个星期二
C 根据日历出触发.可以忽略,实际使用场景很少。