本文规则相关内容大部分来自于 Quartz 官方,SpringBoot 和 TeamCity 等软件的 cron 规则都来自于此。
1. cron 表达式在线生成地址
2. 语法说明
说明:下列可选值中字母部分是不区分大小写的
| 字段含义 | 秒 | 分钟 | 时 | 日 | 月 | 星期几 | 年(可选) |
|---|---|---|---|---|---|---|---|
| 可选值 | 0-59 | 0-59 | 0-23 | 1-31 | 1-12 or JAN-DEC | 1-7 or SUN-SAT | 空 或者 1970-2099 |
| 可选符号 | , - * / | , - * / | , - * / | , - * / ? L W | , - * / | , - * ? / L # | , - * / |
特殊符号说明
| 符号 | 说明 |
|---|---|
| * | 表示可以是任意值 |
| - | 表示范围值,比如:在第三位(时)上的 10-12,就是指 10 点、11 点、12 点 3 个时间点 |
| , | 表示枚举,比如:在第一位(秒)上的 5,6,9,18 就是指在每分钟的第 5 秒、第 6 秒、第 9 秒、第 18 秒分别执行 |
| / | 表示从起始时间,每隔多长时间执行一次,比如:在第一位(秒)上的 3/20 就是在每分钟的第 3 秒,第 23 秒、第 43 秒分别执行 |
| ? | 当星期 和日两个日期设定的日期有可能冲突,为了解决这个问题,对于无所谓的那个字段,使用?来避免冲突 |
| L | 表示最后。默认是指定月份的最后一天或者星期日。如果在星期上使用 6L,表示:最后一个星期五 **(这个和其他有区别,需要注意)**如果使用 L-3,表示:表示日历月的第三条到指定月份的最后一天 |
| W | 用于指定工作日(周一至周五)。比如:15W,表示离每月15日最近的工作日”。如果 15 日是工作日,那么将在 15 日触发;如果 15 日是周六,那么在将在 14 日周五触发;如果 15 日是周日,那么将在 16 日周一触发;注意:假设设定为 1W,并且第一天是周六,那么将在第三天的周一触发,因为它不会“跳过”一个月的天数边界。只有当月份中的某一天是一天,而不是一个日期范围或列表时,才能指定“W”字符。另外: LW 可以混用,表示最后指定月份的最后一个星期 |
| # | 用于指定一个月的第几个星期几。比如:6#3表示“每月的第三个星期五”(第6天=星期五,“#3”=每月的第3个星期五)。注意,如果您指定了“#5”,并且该月没有第 5 周,那么就不会被触发。 |
3. example
3.1. cron 示例
| cron 表达式 | 说明 |
|---|---|
| 0 15 10 * * ? 2005 | 触发时机:在 2005 年的每天的 10:15 |
| 0/5 * 14,18 * * ? | 触发时机:每天下午 2:00:00-2:59:55 和下午 6:00:00-6:59:55 中从第 0 秒开始,在这两个时间范围内每 5 秒执行一次 |
| 0 15 10 ? * 6L 2002-2005 | 触发时机:在 2002,2003,2004,2005 年的每个月的最后一个周五的 10:15 |
| 0 15,17 10 ? * 6#3 | 触发时机:在每个月第三周周五的 10:15 和 10:17 |
3.2. SpringBoot 使用 demo
/* 启动类 */
@EnableScheduling // 配置启动定时任务
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
/* 定时任务执行类 */
@Component
public class TaskTestService {
@Scheduled(cron = "*/2 * * * * ?")
public void test(){
System.out.println("当前任务执行时间"+ LocalDateTime.now());
}
}