CRON表达式
由于Spring的发展,许多公司都把掌握Spring作为一种基本的入门技能吧。而定时任务是在开实际开发中经常会用到的功能,说到定时任务,是不是经常在Spring配置文件或者注解上看见类似如下的字符串
"0 0/5 * * * ?"
"0 10,44 14 ? 3 WED"
"0 0-5 14 * * ?"
"0 15 10 * * ? 2005"
这些字符串其实就是所谓的CRON表达式
CRON表达式其实就是 有固定格式 的字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek
每个域都有固定的可输入的字符:
Seconds:可出现", - * /"四个字符,有效范围为0-59的整数 Minutes:可出现", - * /"四个字符,有效范围为0-59的整数
Hours:可出现", - * /"四个字符,有效范围为0-23的整数
DayofMonth:可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
Month:可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek:可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year:可出现", - * /"四个字符,有效范围为1970-2099年
其中
*: 代表任意匹配,譬如在Seconds中输入*,表示每秒钟都执行任务。
?: 也是代表任意匹配,可是它只能在DayofWeek和DayofMonth使用,但是因为他们两个相互约束的原因,在实际使用中往往不能任意匹配。那为什么要使用 ? 而不使用 * 呢,因为要区分呀,譬如我要每个月的15号执行任务,我CRON表达式为 "1 2 3 15 * ?",最后一位DayofWeek只能使用?才能达到效果,如果使用*,那么就是不管星期几都执行,那么就违背了原意了。
/: 它的表示形式是 a/b,意思是从a开始,每隔b执行一次,假如在second 写了 2/2,那么会在2s开始,每2s执行一次。
-: 表示范围,形式是a-b,表示从a开始到b每单位执行一次,譬如在second处写了2-20,表示在2s到20s每秒执行一次。
,: 表示枚举值,形式是a,b,表示在a,b时刻各执行一次。
L: 表示最后,只能在DayofWeek 和 DayofMonth 使用,譬如1L表示最后一个星期天执行。(记住开始1星期天不是星期一)
W: 表示最近有效工作日(周一至周五)。只能在DayofMonth使用。
#: 只能出现在DayofWeek,譬如 1#2 表示第2个星期日。