quartz中cron表达式配置

cron是unix系统中的crontab底层任务调度所用的一种表达方式。cron在quartz和spring task等调度框架、工具中都会使用到。

cron表达式中共包含7个字段(参数),分别表示秒、分、时、日、月、周、年,其中年是可选字段。

下面我们来详细介绍下这7个字段 :

秒:  允许的值 0-59,可含特殊字符   -  /   ,  *

分:  允许的值 0-59,可含特殊字符   -  /   ,  * 

时:  允许的值 0-23,可含特殊字符   -  /   ,  * 

日(月中的天):允许的值 0-31,可含特殊字符  -  /   ,  * ? L  W C

月: 允许的值 1-12或JAN-DEC ,可含特殊字符   -  /   ,  * 

周(周中的天): 允许的值 1-7或SUN-SAT ,可含特殊字符    /   ,  * ? L  C #

年(可选字段):一般不填此字段,若填则允许的值为1970-2099,可含特殊字符   -  /   ,  *  

特殊字符(*) :表示存在的任意的值

特殊字符(-):表示连续区间的值,例如 5-10表示取5到10的直接的所有值(包括5和10) 

特殊字符(,):表示孤立的值列表,例如1,2,5表示取1、2、5三个孤立的值

特殊字符(/):表示从某开始间隔(步长)取值,例如 秒字段 0/15表示从0开始每15秒取一个值,即:0、15、 30、 45。注意秒位的0/15和*/15是不同的,虽然它们都是每15秒取一个值,但是前者永远是取第0、15、30、45秒 ,而后者表示从任意当前时间(秒)开始每15秒取一次值。例如,若当前时间的秒数为1,则*/15的取值为 1、16、31、46 秒

特殊字符(?):"?"表示不指定值。 "?"只能出现在日或周字段中,且当出现在日字段中时,周字段就不能用"?" ,当出现在周字段中时,日字段中就不能用"?" 。这是因为在不同的月份中,月中的天(日)和周中的天(周)是相互冲突的,指定了日就只好忽略指定周,反过来指定了周就只能忽略指定日了。 比如,有这样一个定时任务: 每个月的5号的早上10点整发送一封邮件给公司老总。在这个任务的cron表达式中,月份字段为"*",日字段为"5",那么周字段应该填多少呢? 可能这个月的5号正好对应为周四(那么cron为0 0 10 5 * 4)  ,可是下个月5号呢,难道也还对应为周四吗, 显然不一定。

特殊字符(L):表示last,在日字段中表示月中的最后一天(大月为31号,小月30号,平年二月28号,闰年二月为29号),在周字段中表示周中的最后一天(即周六或7)

特殊字符(W):表示work(day) ,只能出现在日字段中,用来描叙最接近指定日的工作日(周一到周五) ,例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第 16天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在 day-of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日,即最后一个星期五。

特殊字符(#): 只能出现在周字段。用来指定这个月的第几个周几。例:在周字段用"6#3" or "FRI#3"指这个月第5个周五(6指周五,3指第3个)。如果指定的日期在某月份不存在,则触发器就不会触发 。

cron表达式实例 :

从当前时间开始每5秒执行一次     */5 * * * * ? 

从0秒开始每5秒执行一次   0/5 * * * * ?

工作日(周一至周五)下班(18:00)时发送工作邮件     0 0 18 ? * 2-6 

每年的父亲节(6月的第三个星期日)的12点整给父亲送去祝福     0 0 12 ? 6 7#3 

每年的母亲节(5月的第二个星期日)的12点整给母亲送去祝福     0 0 12 ? 5 7#2

你可能感兴趣的:(java编程,cron)