CRON表达式

来源:互联网 发布:java资料下载 编辑:程序博客网 时间:2024/05/20 11:49

在使用QUARTZR的时候,免不了要使用CRON表达式,在新项目开始之前先来接触一下这个表达式:

CRON-Expressions是一串字符串,实际上它由六(七)个子字符串组成,子字符串间采用空格分离,从左到右分别代表:Seconds Minutes Hours Day-of-Month Month Day-of-Week  Year

字符串“0 0 12 ? * WED 2012”是一个完整的Cron-Expressions例子,它所表达的意思是:2012年每周三早上1200
其中 Day-of-Month 和 Day-of-Week 是不能重复的,最后一位年可以缺失。
所有子表达式都有一定的取值范围,现在对其取值范围进行说明:
子表达式
允许的值
允许的特殊字符
Seconds
0-59
,- * /
Minutes
0-59
,- * /
Hours
0-23
,- * /
Day-of-Month
1-31
,- * ? / L W 
Month
1-12或JAN-DEC
,- * /
Day-of-Week
1-7或SUN-SAT
,- * ? / L #
Years(Optional)
为空或1970-2099
,- * /
 

其中,表示枚举,如10,11,20在HOURS中取值为10,11,,20;

其中-表示范围,如10-12在HOURS中取值为10,11,12;

*通配表示所有的取值,如在Minutes中*表示每分钟;

?表示没有对该域指定值,可以为任意值,不对该域进行限制,只有Day-of-Month和Day-of-Week可以取值?;

/表示一个左边的数值是右边基数的递增值,如在Minutes中取0/15表示的是从0开始,每隔15分钟取一次值,就是0,15,30,45;5/15在Seconds中取值为5,20,35,50;

L’字符表示:‘L’是取‘Last’的第一个字母,也只能用在Day-of-MonthDay-of-Week域中,在Day-of-Month域中的意思是:月份的最后一天,在Day-of-Week域中的意思是:‘7’或‘SAT’,但是在Day-of-Week域中用在另一个值后的意思是:该月的最后一个星期几,如:‘6L’为:该月的最后一个星期五;

W’字符表示:‘W’是取‘Weekday’的第一个字母,只能用在Day-of-Month域中,‘W’代表了最接近给定那一天的工作日,如:在Day-of-Month域中把值设为:15W,表示的意思是:该月的第15日最接近的工作日,所以当第15日是周六时,Trigger将在第14日的周五执行触发,当第15日是周天时,Trigger将在第16日的周一执行触发,当第15日是工作日时,Trigger将在第15日的当天执行触发;然而在Day-of-Month域中把值设为:1W,当第1日是周六时,Trigger将在第3日的周一执行触发,因为它不会跨越月份的范围,‘W’字符只能是该月中的一天,而不是一个范围或天数的列表;

Day-of-Month 域中可以结合使用‘L’和‘W’字符‘LW’,‘LW’表示:月份的最后一个工作日;

‘#’字符表示:月份的第几个星期几,只能用在Day-of-Week域中,如:在Day-of-Week域中把值设为:6#3,表示的意思是:该月的第3个星期5(day 6=Friday and “#3”=the 3rd one in the month);2#1表示的意思是:该月的第1个星期1;4#5表示的意思是:该月的第5个星期3;需要注意:不能把值设为“#5”,因为一个月中不可能都有第5个星期3,如果这样设置,将导致该月无法执行触发;

下面举一些完整的Cron- Expressions例子:

表达式

意思

0 0 12 * * ?

每天12:00执行触发

0 15 10 ? * *

每天10:15执行触发

0 15 10 * * ?

每天10:15执行触发

0 15 10 * * ? *

每天10:15执行触发

0 15 10 * * ? 2005

2005年的每天10:15执行触发

0 * 14 * * ?

每天从14:00到14:59每隔1分钟执行一次触发

0 0/5 14 * * ?

每天从14:00到14:59每个5分钟执行一次触发

0 0/5 14,18 * * ?

每天从14:00到14:59和18:00到18:59每隔5分钟执行一次触发

0 0-5 14 * * ?

每天从14:00到14:05每隔1分钟执行一次触发

0 10,44 14 ? 3 WED

3月的每个星期3的14:10和14:44分别执行一次触发

0 15 10 15 * ?

每月的第15日10:15执行一次触发

0 15 10 L * ?

每月最后一天的10:15执行一次触发

0 15 10 ? * 6L

每月的最后一个星期5的10:15执行一次触发

0 15 10 ? *  6L 2002-2005

2002、2003、2004、2005年的每个月的最后一个星期5的10:15执行一次触发

0 15 10 ? * 6#3

每月的第3个星期5的10:15执行一次触

Schedule中要求比较复杂,采用单个的Trigger无法实现时,可以配置多个的Trigger来实现,比如:每天的9:0010:00之间每隔5分钟执行一次触发,并且在每天的13:0022:00之间每隔20分钟执行一次触发,配置2Trigger并把2配置好的2Trigger注册到相同的Job中就可以很简单的实现上述情况。

每天的9:0010:00之间每隔5分钟执行一次触发  0 0/5 9 ? * *

每天的13:0022:00之间每隔20分钟执行一次触发 0 0/20 13-21 ? * *

 

 

 

 

 

原创粉丝点击