总结自:https://www.cnblogs.com/javahr/p/8318728.html
Cron有两种语法形式:
1、Seconds Minutes Hours DayofMonth Month DayofWeek Year
2、Seconds Minutes Hours DayofMonth Month DayofWeek
即: 秒 分 小时 月份中的日期 月份 星期中的日期 年
各字段解析:
字段 | 允许值 | 允许的特殊字符 |
秒(Seconds) | 0~59的整数 | , - * / 四个字符 |
分(Minutes) | 0~59的整数 | , - * / 四个字符 |
小时(Hours) | 0~23的整数 | , - * / 四个字符 |
日期(DayofMonth) | 1~31的整数(但是你需要考虑你月的天数) | ,- * ? / L W C 八个字符 |
月份(Month) | 1~12的整数或者 JAN-DEC | , - * / 四个字符 |
星期(DayofWeek) | 1~7的整数或者 SUN-SAT (1=SUN) | , - * ? / L C # 八个字符 |
年(可选,留空)(Year) | 1970~2099 | , - * / 四个字符 |
特殊字符解析:
* :匹配该域的任意(每个)值。假如在Minutes域使用*, 即表示每分钟都会触发事件。简单列即为“每xx”
?:只能用于日期和星期,且只有一方能用,也是匹配任意值,但指的是符合另一方规则的任意值,相当于我随便,听你的。
备注:日期与星期有天然的冲突,例如如果我相匹配每个月的20号(DayofMonth 20),那么星期该如何处理?‘*’当然不行,这是就得使用‘?’,相当于“每个月20号,随便哪个星期”
-:表示一个范围内的任意(每个)值,如Minutes域使用5-20,表示:从5分到20分钟,每分钟触发一次。
/:表示起始时间开始触发(起始时间也会触发),每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5、25、45....触发
,:枚举出触发时间。例如:在Minutes域使用5,20,则意味着在5和20分触发
L:只能用于日期和星期,表示月/星期的最后一个匹配日(注意不是最后一天),例如:DayofWeek域使用5L,意味着在最后的一个星期四触发
W:只能用于日期,表示最近的工作日,例如:DayOfMonth域使用5W,如果5号是星期日,则匹配到下周的星期一
LW:L与W连用,但并不是概念的结合,而是此月的最后一个工作日。
#:用于DayofWeek,不仅仅表示星期几,能与数字结合,表示某个月的第几个星期几,例如4#2,即某月的第二个星期三