Cron 语法
相关链接:
Quartz Cron 和 UNIX Cron
Quartz Cron 表达式的格式十分类似于 UNIX Cron 格式,但还是有明显的区别:
一:Quartz 的格式向下支持到秒级别的计划,而 UNIX Cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。
二:在 UNIX Cron 里,要执行的命令是存放在 Cron 表达式中的,在第六个域位置上。Quartz 用 Cron 表达式存放执行计划。引用了 Cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上。
三:表达式中支持域的数目不同。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。下表列出了 Quartz Cron 表达式支持的七个域。
名称 | 是否必须 | 允许值 | 特殊字符 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日 | 是 | 1-31 | , - * ? / L W C |
月 | 是 | 1-12 或 JAN-DEC | , - * / |
周 | 是 | 1-7 或 SUN-SAT | , - * ? / L C # |
年 | 否 | 空 或 1970-2099 | , - * / |
操作符号
同 UNIX Cron 一样,Quartz Cron 表达式支持用特殊字符来创建更为复杂的执行计划。然而,Quartz 在特殊字符的支持上比标准 UNIX Cron 表达式更丰富了。
共有
一个区域多个数值
,
逗号、-
连词符 、*
星号,同 Unix Cron 。
/
斜杠
同 Unix Cron ,用于表示跳过某些给定的数。
例如:
1、 */3
在小时域中等于 0,3,6,9,12,15,18,21
(被3整除的数),跳过了给定 *
当中的其他数。
2、在整点和半点时每15秒触发一次:
0/15 /30 * * * ? *
、 0/15 */30 * * * ? *
、 0/15 0/30 * * * ? *
或 0/15 0-30/30 * * * ? *
Quartz Cron 特有
?
问号
?
号只能用在 日
和 周
域上,不能在这两个域上同时使用,也不能不用,该符号用且仅用一次,代表 “并不关心该域上的值”。
*
代表该域上任何可能的值。?
代表不为该域指定值。
L
字母
L
说明了某域上允许的最后一个值,仅被 日
和 周
域支持。
用在 日
域上
表示在月域上指定的月份的最后一天。
例如:
0 0 8 L FEB ? *
:每年二月份最后一天的上午 8:00 触发 trigger 。
0 0 8 L * ? *
:每个月最后一天的上午 8:00 触发 trigger 。
用在 周
域上
1、表示周的最后一天,就是星期六(即数字7)。
例如:
0 0 8 ? * L *
:每周最后一天(即星期六或数字7)上午 8:00 触发 trigger。
2、一个数字 与 L连用,表示月份的最后一个星期的第 X 天
例如:
0 0 8 ? * 1L *
:每个月的最后一个星期的第一天,即星期日。
0 0 8 ? * 7L *
:每个月的最后一个星期的第七天,即星期六。
3、不能让范围和列表值与 L
连用
以下是错误的:
0 0 8 ? * 1,2,3L *
、 0 0 8 ? * 1-3L *
W
字母
W
表示离指定日最近的一个平日 (Mon-Fri),并且仅能用于日域中,且指定日必须为单天,不能是范围或列表值。
如果指定日为平日,那么当日触发;如果指定日为星期六或星期日,那么在离指定日最近一个平日触发。
大部分商业相关的处理都是基于工作周的,所以 W
字符可能是非常重要的。
例如:
0 0 8 15 * ? *
:每个月的15号上午 8:00 触发 trigger。
0 0 8 15W * ? *
:每个月离15号最近的一个平日的上午 8:00 触发 trigger,利用生成器观察结果。
#
井号
#
表示月份中第几周的第几天,并且仅能用于周域中。
例子:
0 0 8 ? * 1#1 *
:每个月的第一周的第一天(星期日)的上午 8:00 触发 trigger。
0 0 8 ? * 7#1 *
:每个月的第一周的第七天(星期六)的上午 8:00 触发 trigger。
假如指定#5,然而月份中没有第 5 周,那么该月就不会触发,例如:
0 0 8 ? * 1#5 *
:每个月的第五周的第一天(星期日)的上午 8:00 触发 trigger。
0 0 8 ? * 7#5 *
:每个月的第五周的第七天(星期六)的上午 8:00 触发 trigger。
日
和 周
域
日
域上值是 25,周
域上值是 WED,那么是在每个月的 25 号且为星期三的那天触发 trigger,还是每个月的 25 号和每个月的星期三都会触发 trigger?
Quartz cron 表达式不能同时在 日
和 周
域上指定值,一定有一个 ?
号,所以不会出现这种情况。
UNIX cron 表达式如果 日
和 周
同时被设置,那么其中的一个条件被满足时,指令便会被运行。
常用 Cron 表达式列表
说明 | 表达式 |
---|---|
每天中午 12:00 触发 | 0 0 12 * * ? |
每天上午 10:15 触发 | 0 15 10 * * ? |
每天上午 10:15 触发 | 0 15 10 ? * * |
每天上午 10:15 触发 | 0 15 10 ? * * * |
2005年每天上午 10:15 触发 | 0 15 10 * * ? 2005 |
每天下午 2:00 到下午 2:59 期间的每一分钟触发 | 0 * 14 * * ? |
每天下午 2:00 到下午 2:55 期间的每五分钟触发 | 0 0/5 14 * * ? |
每天下午 2:00 到下午 2:55 期间和下午 6:00 到 6:55 期间的每五分钟触发 | 0 0/5 14,18 * * ? |
每天下午 2:00 到下午 2:05 期间的每]一分钟触发 | 0 0-5 14 * * ? |
每年三月份的每个周三的下午 2:10 和下午 2:44 触发 | 0 10,44 14 ? 3 WED |
每周从周一到周五的上午 10:15 触发 | 0 15 10 ? * MON-FRI |
每月15号上午 10:15 触发 | 0 15 10 15 * ? |
每月最后一天的上午 10:15 触发 | 0 15 10 L * ? |
每月最后一个周五的上午 10:15 触发 | 0 15 10 ? * 6L |
2002年至2005年的每月最后一个周五的上午 10:15 触发 | 0 15 10 ? * 6L 2002-2005 |
每月第三个星期的第六天(星期五)的上午 10:15 触发 | 0 15 10 ? * 6#3 |
每月从第一天算起每五天的中午 12:00 触发 | 0 0 12 1/5 * ? |