定时任务 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次

























































































































































































































































































































































































































