定时任务 Cron 表达式详细讲解
简介
定时任务,就是能够在规定时间内重复执行
的任务。而定义定时任务的表达式就是 Cron
表达式。
Corn 表达式就是一个字符串,它以 5 或 6 个空格隔开,包含 6 或 7 个域,每一个域代表一个含义,Cron 表达式有两种语法格式:
(1)秒 分 时 日 月 周 年
(2)秒 分 时 日 月 周
第二种语法格式少了一个年
,代表每一年,尽量使用第一种,第二年钟可能会出现奇怪的 bug
各字段的符号范围以及允许字符:
字段 | 允许值 | 允许字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
时 | 0-23 | , - * / |
日 | 1-31 | , - * ? / L W C |
月 | 1-12 或 JAN-DEC | , - * / |
周 | 1-7 或 SUN-SAT | , - * ? / L C # |
年 | 留空 或 1970-2099 | , - * / |
详解
Cron 在线表达式生成器:http://cron.ciding.cc/
秒
允许值范围: 0~59,不允许为空值
*
:每隔 1 秒钟触发。例子:* * * * * *
代表每秒钟执行 1
次
,
:指定的秒数触发。例子:0,30,45 * * * * *
代表每分钟的第 0,30,45
秒执行
-
:指定的范围内触发。例子:10-30 * * * * *
代表每分钟从第10秒开始到第30秒
结束,每隔1秒执行1次
/
:触发步进,/
前面的值代表初始值(没有则为 0
),后面的值代表偏移量。例子:
5/10 * * * * ?
代表从第5
秒开始,每隔10
秒执行 1 次/20 * * * * ?
代表从第0
秒开始,每隔20
秒执行 1 次10-40/10 * * * * *
代表从第10
秒开始,第40
秒结束,每隔10
秒执行1
次
分
允许值范围: 0~59,不允许为空值
*
:每隔 1 分钟触发。例子:0 * * * * *
代表每分钟执行 1
次
,
:指定的分钟触发。例子:0 0,30,45 * * * *
代表第 0,30,45
分钟执行
-
:指定的范围内触发。例子:0 10-30 * * * *
代表从第10分钟开始到第30分钟
结束,每隔1分钟执行1次
/
:触发步进,/
前面的值代表初始值(没有则为 0
),后面的值代表偏移量。例子:
0 5/10 * * * *
代表从第5
分钟开始,每隔10
分钟执行 1 次0 /20 * * * ?
代表从第0
分钟开始,每隔20
分钟执行 1 次0 10-40/10 * * * *
代表从第10
分钟开始,第40
分钟结束,每隔10
分钟执行1
次
时
允许值范围: 0~23,不允许为空值
*
:每隔 1 小时触发。例子:0 0 * * * *
代表每小时执行 1
次
,
:指定的时间点触发。例子:0 0 0,2,9 * * *
代表第 0,2,9
小时执行
-
:指定的范围内触发。例子:0 0 10-20 * * *
代表从第10点开始到第20点
结束,每隔1小时执行1次
/
:触发步进,/
前面的值代表初始值(没有则为 0
),后面的值代表偏移量。例子:
0 0 5/10 * * *
代表从第5
点开始,每隔10
小时执行 1 次0 0 /20 * * ?
代表从第0
点开始,每隔20
小时执行 1 次0 0 10-20/10 * * *
代表从第10
点开始,第20
点结束,每隔10
小时执行1
次
日
允许值范围: 1-31 , 不允许为空值
W
字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例子:
15W
:离该月 15 号的最近一个平日。假如 15 号是星期六,那么15W
会在 14 号 (星期五) 触发,因为星期四比星期一离 15 号更近。
C
:计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例子:
5C
在日期字段中就相当于日历 5 日以后的第一天。1C
在星期字段中相当于星期日后的第一天。
月
允许值范围: 1~12 (JAN-DEC), 不允许为空值
*
:每月触发。例子:0 0 0 1 * ? *
代表每月 1日
执行 1
次
,
:指定的时间点触发。例子:0 0 0 1 2,5 ? *
代表 2月1日、5月1日
执行
-
:指定的范围内触发。例子:0 0 0 1 8-12 ? *
代表从 8月1日开始,12月1日
结束,每隔1月执行1次
/
:触发步进,/
前面的值代表初始值(没有则为 0
),后面的值代表偏移量。例子:
0 0 0 1 1/2 ? *
代表从1月1日
开始,每隔2
月执行 1 次0 0 0 1 /2 ? *
代表从1月1日
开始,每隔2
年执行 1 次0 0 0 1 2-10/2 ? *
代表从2月1日
开始,10月1日
结束,每隔2
月执行1
次
周
允许值范围: 1~7 (SUN-SAT),1 代表星期天 (一星期的第一天),以此类推,7 代表星期六 (一星期的最后一天),不允许为空值
*
:每星期都触发;
?
:与 {日期} 互斥,即意味着若明确指定 {日期} 触发,则表示 {星期} 无意义,以免引起冲突和混乱
,
:在指定的星期约定触发。例子:
0 0 0 * * 1,3,5
代表星期天、星期二和星期四触发
-
:在指定的星期范围内触发,比如 2-4
代表从星期一开始触发到星期三结束触发,每隔 1 天触发
/
:触发步进 (step),/
前面的值代表初始值 (等同 1),后面的值代表偏移量,例子:
1/3
或者/3
:从星期天开始触发,每隔 3 天触发 1 次1-5/2
:在 [1,5] 范围内,每隔 2 天触发,即星期天、星期二、星期四触发
L
如果 {星期} 占位符如果是 L
,即意味着星期的的最后一天触发,即星期六触发,L= 7 或者 L = SAT,例子:
5L
:一个月的最后一个星期四触发
#
用来指定具体的周数,#
前面代表星期,#
后面代表本月第几周,例子:
2#2
:本月第二周的星期一,5#3
表示本月第三周的星期四,因此,5L
这种形式只不过是#
的特殊形式而已
年
允许值范围: 1970~2099 , 允许为空
*
:每年触发。例子:0 0 0 1 1 ? *
代表每年 1月1日
执行 1
次
,
:指定的时间点触发。例子:0 0 0 1 1 ? 2022,2023
代表 2022年1月1日、2023年1月1日
执行
-
:指定的范围内触发。例子:0 0 0 1 1 ? 2022-2032
代表从 2022年1月1日开始到2032年1月1日
结束,每隔1年执行1次
/
:触发步进,/
前面的值代表初始值(没有则为 0
),后面的值代表偏移量。例子:
0 0 0 1 1 ? 2022/2
代表从2022
年开始,每隔2
年执行 1 次0 0 0 1 1 ? /2
代表从当前年1月1日
开始,每隔2
年执行 1 次0 0 0 1 1 ? 2022-2032/2
代表从2022年1月1日
开始,2032年1月1日
结束,每隔2
年执行1
次