优秀的在线Cron表达式生成器:https://www.pppet.net/ , 里面也有一些常用符号的解释。
cron表达式应用于java的quartz定时任务框架中,也存在于Linux的crontab服务中,但表达式的语法基本一致,区别在于前者是6或7个域,后者是5~6个域, 最后一个域为年,都可以省略。
表达式 | 解释 | 区别 | |
---|---|---|---|
Java-quartz | 15 1 * * * ? | 每小时的第1分钟的第15秒执行一次,即每小时执行一次 | 6个域,从左到右:秒 分钟 小时 天 月 星期 |
Linux-crontab | 1 * * * ? | 每小时的第1分钟执行一次 | 5个域,从左到右:分钟 小时 天 月 星期 |
即crontab的时间粒度是1分钟,quartz的时间粒度是1秒。
每个域的释义及取值
以java的quartz中的cron表达式为例详细说明。以下表格copy form quartz官方文档:
Field Name | Mandatory | Allowed Values | Allowed Special Characters |
---|---|---|---|
Seconds | YES | 0-59 | , - * / |
Minutes | YES | 0-59 | , - * / |
Hours | YES | 0-23 | , - * / |
Day of month | YES | 1-31 | , - * ? / L W |
Month | YES | 1-12 or JAN-DEC | , - * / |
Day of week | YES | 1-7 or SUN-SAT | , - * ? / L # |
Year | NO | empty, 1970-2099 | , - * / |
Note:
Day of week,用1-7表示时,1对应表示Sunday,7表示Saturday。第一天是Sunday,最后一天是Saturday。
特殊字符用法
-
,-*/
这4个字符在每个域都是通用的,直接举例说明:
5,30 1 * * * ?
在每个小时的第1分钟的第5秒和第30秒执行一次,一小时执行两次;
0 0-5 14 * * ?
从每天下午14:00开始,14:00~14:05之间每分钟执行一次;
0 1/5 14 * * ?
从每天下午14:01开始,每5分钟执行一次(一直到14点结束);
注意: 上述表达式有?
,放在下面解释 -
?
从上面表格中看到?
只用于天和星期这俩域。因为这俩域一起用的时候会有冲突,
考虑以下非法表达式:
* * 14 1 * 2
每个月1号的14:00开始,但是又限定星期取2(星期一),如果1号不是星期一,定时任务要不要执行呢?这就存在一种疑问,因此:
1.Day of month
和Day of week
使用上有冲突,不可以一起用,用了这俩其中一个,另外一个要用?
;
2. 如果其中一个是*
,另外一个最好也得是?
(但是目前spring和crontab都是支持两个域都为*的情况的)
合法的表达式:
* * 14 1 * ?
每个月1号的14:00执行一次,每月执行一次;
* * 14 ? * 2
每个月的星期一的14:00执行一次,每个星期执行一次; -
L
即last,最后一天:
0 0 1 L * ?
每个月的最后一天的1:00:00执行一次,每月执行一次;
0 0 1 ? * L
每周的最后一天(即每周的周六)的1:00:00执行一次,每周执行一次; -
W
即weekday,工作日,从Monday-Friday为工作日
0 0 1 15W * ?
15W,意思是每个月的15号,如果15号是工作日,就15号执行;如果15号是周六或周日,就选离15号最近的工作日,但选择最近不会跨月。此表达式表示一个月执行一次
另外LW可以连用:
0 0 1 LW * ?
表示每个月的最后一个工作日,一个月执行一次 -
#
举例
0 0 1 ? * 6#3
表示每个月的第3周的第6天,即每个月的第3周的周五执行一次,一个月执行一次
参考: