语法结构
Cron表达式是一个以5或6个空格分割为6或7个域的字符串,每个域代表一个含义。Cron有如下两种语法格式:
- Seconds Minutes Hours DayofMonth Month DayofWeek Year
- Seconds Minutes Hours DayofMonth Month DayofWeek
Cron从左到右各个域的含义:秒 分 小时 月份中的日期 月份 星期 年
各个域的含义
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
Seconds | 0 ~ 59的整数 | ,-*/ 四个字符 |
Minutes | 0 ~ 59的整数 | ,-*/ 四个字符 |
Hours | 0 ~ 59的整数 | ,-*/ 四个字符 |
DayofMonth | 1 ~ 31的整数(需注意月的天数) | ,-*/?LWC 八个字符串 |
Month | 1 ~ 12的整数或则JAN ~ DEC | ,-*/ 四个字符 |
DayofWeek | 1 ~ 7的整数或则SUN ~ STA(1=SUN) | ,-*/?LC# 八个字符串 |
Years | 1970 ~ 2099(可选,留空) | ,-*/ 四个字符 |
- ,:表示列出枚举值。如果在Minutes域使用
5,20
,则表示在5分钟和20分钟的时候分别触发一次。 - -:表示范围。如果在Minutes域使用
5-20
,则表示从5分钟到20分钟每分钟都触发一次。 - *:表示匹配该域的任意值。如果在Minutes域使用
*
,则表示每分钟都会触发。 - /:表示起始时间开始触发,然后每隔固定时间触发一次。如果在Minutes域使用
5/20
,则表示在5分钟时触发一次,然后25分、45分分别触发一次。 - ?:只能用在DayofMonth和DayofWeek两个域。同样是匹配域的任意值,但实际情况不会,因为DayofMonth和DayofWeek会相互影响。如果希望在每月20日触发调度,不管20日是星期几,则只能用如下写法:
10 10 15 20 * ?
,其中最后一位只能用?
,而不能使用*
,如果使用*
则表示不管星期几都会触发,实际上并不是这样。 - L:表示最后,只能用在DayofMonth和DayofWeek两个域。如果在DayofWeek域使用
5L
,则表示在最后一个星期四触发。 - W:表示有效工作日(周一到周五),只能用在DayofMonth域,系统将在离指定日期的最近的有效工作日触发。如果在DayofMonth域使用
5W
,表示如果5日是星期六,则将在最近的工作日4日(周五)触发;如果5日是星期日,则在6日(周一)触发;如果5日是在周一到周五中的一天,则就在5日触发。注意:W的最近寻找不会跨过月份。 - LW:L与W字符连用,表示在某个月最后一个工作日,即最后一个星期五。
- #:用于确定每月第几个星期几,只能用于DayofWeek域。如果在DayofWeek域使用
4#2
,则表示某个月的第二个星期三。
注意:
?
字符仅被用于DayofMonth和DayofWeek两个域,表示不指定值,当两个子表达式其中之一被指定值后,为避免冲突,需要将另外一个子表达式的值设为?
。
L
字符是单词last的缩写,仅被用于DayofMonth和DayofWeek两个域。它们在不同的子表达式中含义是不同的:用在DayofMonth表示最后一天,用在DayofWeek表示最后一个星期的最后一天(SAT)。
如果L
前面有具体内容,它就有了其他含义。如:6L
表示这个月的倒数睇6天,FRIL
表示这个月的最后一个星期五。在使用L
参数时,不要指定列表或范围,因为这会导致问题。