Cron表达式语法
最近的项目里面涉及到了定时任务的处理.因此,引入了最常用的Quartz
+Spring
的框架来实现.
而Cron
表达式是Quartz
最主要的支持方式.所以这里记录一下Cron
表达式的用法.
Quartz VS. Unix
Unix
中也是支持Cron
计划任务的. 但是和Quartz
的Cron
定时任务还稍微有一点区别.
- 细粒度的差别
Quartz
的格式支持到秒级别的计划,而Unix
的Cron
计划仅支持到分钟级 - 表达式中支持的域数量不同
Quartz
支持七个域(秒,分,时,日,月,周,年).Unix
支持五个域(分,时,日,月,周) - 命令稍有不同
Unix
中,要执行的操作是放在cron表达式中的.而Quartz
使用cron
表达式仅仅用来表示执行的计划,执行的操作是放在Job
中的
基本语法
上面已经说了,Quartz
支持了七个域. 在一个它的表达式中是由6个或7个字符加空格分隔符组成的.七个域分别如下:
名称 | 必填 | 允许值 | 特殊符号 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日 | 是 | 1-31 | , - * ? / L W C |
月 | 是 | 1-12 | , - * / |
周 | 是 | 1-7 | , - * ? / L C # |
年 | 否 | 空 或 1970-2099 | , - * / |
特殊字符:
, 逗号
这个是用来列举一系列的值的.比如在秒域上的10,15,20
.意味着第10秒,第15秒,第20秒触发- 横杠符
这个是用来指定一个范围的,比如,在分钟域上的 10-20 表示 10分到20分的10分钟.需要注意的是,范围是不能回卷的,比如像20-10这样的是不允许的.* 星号
这个符号是用来表示某个域上的所有值的.比如在小时域上的星号就表示每一个小时./ 斜杠符
斜杠是用来表示一个值的增幅的. 比如在秒域上的0/20
就表示0
,20
,40
这几个值. 也就是a/b
表示从a
开始每次增加b
值.? 问号
问号只能用在日
和周
域上,并且两个域上不能同时使用问号.
问号的意思表示没有值,或者说是不关心该域上的是什么值.它与星号是有区别的,星号表示的是每一个值,而问号是不指定该域的值.这其实主要是用在日
和周
两个域的冲突上的. 当设置了日
后就应该在周
域上设置成?
,反之亦然.L 字母
L
字母同样只能用在日
和周
域上,它是last
的缩写.但是在两个域上表示的意思是不一样的.- 在
日
域上的时候,表示的是一个月的最后一天
,对于1月
那就是31,对于2月
那就是28或29. - 在
周
域上的时候,表示的是7
或SAT
(注意,0表示周日,7表示周六).而如果在L前面再加上一个0-7的数字的话,就表示的是该月最后的一个周几.比如0L
就表示该月最后一个周日.6L
表示该月最后一个周五.
- 在
W 字母
W
字母只可用于日
域上.用来指定给定日期最近的一个工作日(周一到周五).什么意思呢?例如:
在日
域上设置为10W,那么其意思就是距离该月10号最近的一个工作日
.因此,如果10号是周四,那么它就会在当天出发,如果10号是周六,那么它就会在9号周五的时候触发.而如果10号是周天,那么他就会在11号周一的时候触发.需要特别注意的是1W
,如果他是周六.那么它不会在上一个月的最后一天触发,而是会在当月的3号,也就是周一触发.因为它是不能跨月的.而LW
则表示这个月最后一个工作日
C 字母
C
字母只能用在日
和周
域上,它是calendar
的缩写.它表示为基于相关的日历所计算出的值(如果有的话).如果没有关联的日历,那么它就等同于包含全部的日历.比如在日
域上的4C
表示这个月的第4天或之后日历中的第一天,比如在周
域上的1C
表示这个月的第一周或之后日历中的第一天. 这个地方的日历表示的是Quartz
中的Calendar
对象. 它允许用户自定义一个日历出来,使用这个你就能创建一个排除所有节假日的日历了. 假设10号
是放假.那么10C
在你自定义的日历上就表示的11号
# 井号
井号用于周
域上.表示该月第几个周几
. 它的语法是a#b
:该月第b个周a.
比如:4#2
表示该月第二个周三.需要注意的是,如果该月没有这个日期,那么它就不会触发任务,但是不会报错的.比如7#5
表示本月第5个周六. 如果这个月没有5个周,那么就不会执行.
例子
这里列举了一些常见的表达式的例子.可以通过这些举一反三.
分钟的 Cron 表达式
每天的从 5:00 PM 至 5:59 PM 中的每分钟触发
0 * 17 * * ?
每天的从 11:00 PM 至 11:55 PM 中的每五分钟触发
0 0/5 23 * * ?
每天的从 3:00 至 3:55 PM 和 6:00 PM 至 6:55 PM 之中的每五分钟触发
0 0/5 15,18 * * ?
每天的从 5:00 AM 至 5:05 AM 中的每分钟触发
0 0-5 5 * * ?
日上的 Cron 表达式
每天的 3:00 AM
0 0 3 * * ?
每天的 3:00 AM (另一种写法)
0 0 3 ? * *
每天的 12:00 PM (中午)
0 0 12 * * ?
在 2005 中每天的 10:15 AM
0 15 10 * * ? 2005
周和月的 Cron 表达式
在每个周一,二, 三和周四的 10:15 AM
0 15 10 ? * 1-6
每月 15 号的 10:15 AM
0 15 10 15 * ?
每月最后一天的 10:15 AM
0 15 10 L * ?
每月最后一个周五的 10:15 AM
0 15 10 ? * 6L
在 2002, 2003, 2004, 和 2005 年中的每月最后一个周五的 10:15 AM
0 15 10 ? * 6L 2002-2005
每月第三个周五的 10:15 AM
0 15 10 ? * 6#3
每月从第一天算起每五天的 12:00 PM (中午)
0 0 12 1/5 * ?
每一个 11 月 11 号的 11:11 AM
0 11 11 11 11 ?
三月份每个周三的 2:10 PM 和 2:44 PM
0 10,44 14 ? 3 4
更多的例子
每天中午十二点触发
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 点开始到 2 点 59 分每分钟一次触发
0 * 14 * * ?
每天从下午 2 点开始到 2:55 分结束每 5 分钟一次触发
0 0/5 14 * * ?
每天的下午 2 点至 2:55 和 6 点至 6 点 55 分两个时间段内每 5 分钟一次触发
0 0/5 14,18 * * ?
每天 14:00 至 14:05 每分钟一次触发
0 0-5 14 * * ?
三月的每周三的 14:10 和 14:44 触发
0 10,44 14 ? 3 4
每个周一、周二、周三、周四、周五的 10:15 触发
0 15 10 ? * 1-6
每月 15 号的 10:15 触发
0 15 10 15 * ?
每月的最后一天的 10:15 触发
0 15 10 L * ?
每月最后一个周五的 10:15 触发
0 15 10 ? * 6L
每月最后一个周五的 10:15 触发
0 15 10 ? * 6L
2002 年至 2005 年的每月最后一个周五的10:15 触发
0 15 10 ? * 6L 2002-2005
每月的第三个周五的 10:15 触发
0 15 10 ? * 6#3