每次写定时任务都需要搜索CornException表达式,总归有点麻烦,不如看下到底是怎么写的。
首先通过下面这个表格直观的看下表达式的结构:
字段 | 允许值范围 | 特殊符号 |
---|---|---|
秒 | 0-59 | *,- / |
分 | 0-59 | *,- / |
时 | 0-23 | *,- / |
日 | 1-31 | *,- / L W C ? |
月 | 1-12 | , - * / |
周 | 1-7 | *,- / L C # ? |
年(可不填) | 不填默认 1970-2099 | , - * / |
一共七个字段,中间以空格隔开,一般第七个年字段不填,应用场景不多,所以就看前面六个。其中周(1-7),是从周日开始的。
常用符号:
*
这个符号代表每XX,位于哪个字段中就是每(字段名),比如每秒,每分,每时,每月等等;
,
代表多个值,例如 0 0 1,2 * * *
就是指每天的1点和两点执行,可以知道是用于某个字段有多个确定值时;
-
上面刚说是用于多个确定值,那么当我有很多确定值并且在一个范围内时,就可以使用这个符号-
,例如:
0 0 1-2 * * *
代表每天的1到2点执行;
/
有时候我们有循环执行的 需求,那么这个符号就用来设定循环的间隔和起始值。比如 0/2
、*/30
,其中/前的值代表起始值,*
默认就是值范围的开始,也就是0或者星期的1。后面的就是步进值,比如上面的2秒,2分,2小时都可以,简言之就是从什么时候开始,间隔多久执行一次。在周字段中是间隔多少天。
特殊符号:
?
这个符号只能在日和周字段中使用,意思是代表不确定的值,一般情况下和*
没有什么区别(当周和日都没有指定时)。但是当周和日有一个指定时,他的作用就出现了。比如你指定了1号同时又指定周一,这很有可能冲突,1号很有可能不是周一,所以这个时候为了避免冲突,周和日有一个指定的时候,另一个就用?
。
L
此符号只出现在日和周中,在日字段中,代表本月的最后一天,在周字段中,代表本周的最后一天。其中在周中还可以指定最后一个周几,例如:3L,代表最后一个周二。
W
意味着在本月内离当天最近的工作日触发,所谓最近工作日,即当天到工作日的前后最短距离,如果当天即为工作日,则距离为0;所谓本月内的说法,就是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天确实满足最近工作日;因此,"LW"则意味着本月的最后一个工作日触发,W只能在日字段中出现。
#
该符号仅在周字段中出现,用来表示第几周,例如:5#3,本月第三周的周四,联想到L,L只不过是#的特殊用法,最后一周的周几。
个人理解为什么周和日比较特殊,每个月份中的日和周是不太固定的,不像每年的月份都基本一致(除闰年外)。12个月的天数也不是都一样的,同样的在不同的月份中,相同的日子对应的周也不一定相同,使得某些确定性的时间无法指定。这时L在日字段中指定最后一天就显得很有用,同理W在不同月中对应的周和日信息也都不一定相同。模糊的情况下有对应的字段就会更加方便精确的指定需要执行的时间。
本文章参考:http://www.cnblogs.com/pipi-changing/