介绍
- Cron 是一个在 Unix 及类似操作系统上执行计划任务的程序
- Cron表达式是一个表示时间周期的字符串
详解
- Cron表达式是一个字符串,有6或7个域组成,每个域代表一个含义,并且域和域之间以空格分隔
语法格式
秒 | 分 | 小时 | 日期 | 月份 | 星期 | 年份 | |
---|---|---|---|---|---|---|---|
格式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, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC | , - * / |
星期(DayofWeek) | 1 ~ 7 或 SUN, MON, TUE, WED, THU, FRI, SAT (1 = SUN) | , - * ? / L C # |
年(Year,可选) | 1970 ~ 2099 | , - * / |
特殊符号
特殊符号 | 说明 |
---|---|
* | 匹配该域的任意值,例如:Seconds域表示每秒种,Minutes域表示每分钟等 。 |
? | ?只能用在日期(DayofMonth)和星期(DayofWeek)两个域。表示"非明确的值",当表达式中一个指定值之后,为避免冲突,将另外一个互斥设为?。例如:想在每个月1号触发调度,不管1号是星期几,则只能使用如下:0 0 0 1 * ?,其中最后一位只能使用?,不是使用*。 |
- | 表示范围,例如:Minutes域使用5-20,表示从第5分钟到第20分钟,每分钟触发一次 。 |
/ | 表示增量,每隔增量的时间出发一次,例如:Minutes域使用5/20,表示从第5分钟开始,每隔20分钟触发一次,即5,25,45分别触发一次。 |
, | 表示枚举值,例如:Minutes域使用5,20,表示在第5分钟和第20分钟分别触发一次。 |
# | #只能用在星期(DayofWeek)域。表示这个月第几个星期几。例如:6#3 or FRI#3,表示这个月的第3个星期五(6:周五,3:第3个)。如果指定日期不存在,则不会触发。 |
L | L只能用在日期(DayofMonth)和星期(DayofWeek)两个域。是单词Last的缩写。 在日期(DayofMonth)域中,L表示一个月的最后一天,即1月31号,4月30号等。如果L前有数字,例如:6L,表示这个月倒数第6天。在星期(DayofWeek)域中,L表示星期的最后一天,即7或者SAT(星期六)。如果L前有数字,例如:FRIL,表示这个月的最后一个星期五。 |
W | W只能用在日期(DayofMonth)域。表示指定日期最近的工作日。例如:15W,如果15号是周六,则任务在14号(星期五)触发。如果15号是周日,则任务在16号(星期一)触发。如果15号是工作日(星期一到星期五),则任务15号(工作日当天)触发。注意:W不能跨月,如果1号是星期六,任务则会在下个星期一(3号)触发。W只能配合单独数字使用,不能是范围或列表 。 |
LW | 表示每个月的最后一个工作日。 |
C | C只能用在日期(DayofMonth)和星期(DayofWeek)两个域。是单词Calendar的缩写,表示计划所关联的日期。在日期(DayofMonth)域中,5C表示5日后的第一天,即6号。在星期(DayofWeek)域中,1C表示星期日后的第一天 ,即星期一。 |
示例
cron表达式 | 含义 |
---|---|
*/5 * * * * ? | 每隔5秒触发一次 |
0 */1 * * * ? | 每隔1分钟触发一次 |
0 0-5 14 * * ? | 下午2:00到2:05期间每隔1分钟触发一次 |
0 0 10,14,16 * * ? | 每天上午10点,下午2点,下午4点整触发一次 |
0 15 10 L * ? | 每个月最后一天上午10:15触发一次 |
0 15 10 LW * ? | 每个月最后一个工作日上午10:15触发一次 |