一、什么是时间表达式
cron(计划任务),是任务在约定的时间执行已经计划好的工作。cron表达式是字符串,以5或6个空格隔开,分为6或7个域,每个域代表一个含义,cron表达式有如下两种:
秒 分 时 日 月 星期 年
秒 分 时 日 月 星期
- 1.1 各字段含义
字段 | 允许值 | 允许特殊字符 |
---|---|---|
秒 | 0-59的整数 | , - * / |
分 | 0-59的整数 | , - * / |
时 | 0-23的整数 | , - * / |
日 | 1-31的整数 | , - * ? / L W C |
月 | 1-12的整数或者JAN-DEC | , - * / |
星期 | 1-7的整数或者SUN-SAT(1==SUN) | , - * ? / L C # |
年(可空) | 1970~2099 | , - * / |
- 1.2 各特殊字符含义
特殊字符 | 含义 | 备注 |
---|---|---|
, | 列举出枚举值 | |
- | 表示范围 | |
* | 表示匹配改域的任意值 | |
? | 表示不为该域指定值 | 只能在日、星期两个域,不能同时在这两个域上指定"?" |
/ | 表示起始时间开始触发,然后每隔固定时间触发一次 | |
L | 表示最后 | 只能在日、星期两个域 |
W | 表示有效工作日(周一到周五) | 只能作用于日域 |
LW | 表示某个月最后一个工作日,即最后一个星期五 | 只能作用于日域 |
# | 表示每月的第几个周星期几 | 只能作用于日域 |
C | 表示计划所关联的日期,如5C在日域中表示日历5日后的第一天,1C在星期域中表示星期日后第一天 | 只能作用于日、星期两个域 |
二、时间表达式示例
时间表达式 | 含义 |
---|---|
0 0 10,14,16 * * ? | 每天10点、14点、16点 |
0 0 9-17 * * ? | 每天9点到17点的整点 |
0 0 9-12,14,16-17 * * ? | 每天9-12点、14点和16-17点 |
0 0/15 9-17 * * ? | 每天9点到17点期间每隔15分钟 |
* * 9-17 * * ? | 每天9点到17点每一秒 |
0 15 10 * * ? * | 每天10点15 |
0 15 10 * * ? 2019 | 2019年的每天10点15 |
0 0 12 ? * 1 或 0 0 12 ? * WED | 每周日12点 |
0 15 10 ? * 6L 或 0 15 10 ? * FRI | 没有的最后一个星期五10点15分 |
0 30 12 L * ? | 每个月最后一天的12点30分 |
0 10 10 LW * ? 2019 | 2019年每月的最后一个工作日10点10分 |
0 0 9 ? * 6#3 | 每月的第三个星期五9点整 |
三、Java工具生成时间表达式
引入工具cron-util工具包
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>8.1.1</version>
</dependency>
生成时间表达式:
public static void main(String[] args) {
Cron cron = CronBuilder.cron(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ))
.withYear(always())
.withMonth(always())
.withDoW(questionMark())
.withDoM(on(10))
.withHour(between(9, 17))
.withMinute(every(15))
.withSecond(always())
.instance();
System.out.println(cron.asString());
}
---
* */15 9-17 10 * ? *