介绍
Crom表达式(Cron Expressions)用于表达一段时间内进行的次数,一般用于自动化操作中频率的设置。
可以用于linux中crontab定时任务以及schedule中间件的频率设置。
字段组成
Cron表达式由7个字段组成,最后一个字段为可选。
//秒、分、时、天、月、星期、年
0 0 12 * * ? 2017
7个字段分别是:秒、分、时、DAY-OF-WEEK(天)、月、WEEK-OF-DAY(星期)、年(可选)
每个字段上可以填写字段取值范围内的值,还可以使用特定字符来表达频率。
字段取值范围
这是每个字段的取值范围:
Name | Required | Allowed Values | Allowed Special Characters |
---|---|---|---|
Seconds | Y | 0-59 | , - * / |
Minutes | Y | 0-59 | , - * / |
Hours | Y | 0-23 | , - * / |
day of month | Y | 1-31 | , - * ? / L W C |
Month | Y | 0-11 or JAN-DEC | , - * / |
day of week | Y | 1-7 or SUN-SAT | , - * ? / L C # |
Year | N | empty or 1970-2099 | , - * / |
通用特定字符
符号 | 描述 |
---|---|
* | 代表所有(all) |
, | 代表多个选项,比如:1,2,3 |
- | 代表一个范围,比如1-15 |
/ | 增长起点与步长,0/5代表:5 10 15 20 25 … |
特殊特定字符
符号 | 描述 |
---|---|
? | 适用于day of month与day of week字段,想当于禁用的意思,如果选择了使用天这个字段,则在星期字段使用?标识 |
L | 代表LAST,最后。在day of month中代表一个月中的最后一天(Last day of month),在day of week中标识,最后一个星期的某一天。6L最后一个星期五。 |
W | 适用于day of month天字段,定义每个月中的星期,10W代表离10最近的工作日,如果10号是星期日,那么会在11号星期一触发。如果11号是星期六,那么会在10号星期五触发。 |
# | 适用于day-of-week这个字段,代表每个月第nth个工作日,6#3代表,这个月第三个星期五 |
示例
At 12:00 pm (noon) every day during the year 2017
1.2017年的每天中午12点触发
//第四个字段和第六个字段:DAY OF MONTH 和 DAY OF WEEK 成互斥关系,每个表达式中必定有一个为?
//在这个表达式中,每天都需要进行,那么无关星期,所以DAY OF WEEK为?
0 0 12 * * ? 2017
Every 5 minutes starting at 1 pm and ending on 1:55 pm and then starting at 6 pm and ending at 6:55 pm, every day
2.每天中午1点开始到1点55,以及每天下午6点到6点55,每五分钟触发
0 0-55/5 13,18 * * ?
等同于
0 0/5 13,18 * * ? //由于60分,h(小时)位已经改变,所以也可以这么写
Every minute starting at 1 pm and ending on 1:05 pm, every day
3.每天中午1点到1点5分,每分钟触发
0 0-5/1 13 * * ?
//默认的步长就是1,分钟位一分钟一分钟增加
At 1:15 pm and 1:45 pm every Tuesday in the month of June
4.每年6月份的每个星期2的中午1点14和1点45
0 15,45 13 ? 5 3
0 15,45 13 ? 5 Tue
//星期从星期日开始算,星期二就是3,可以写成Tue 更容易理解
At 9:30 am every Monday, Tuesday, Wednesday, Thursday, and Friday
5.每个工作日的9点30
0 30 9 ? * 2-6
0 30 9 ? * Mon-Fri
At 9:30 am on 15th day of every month
6.每个月份中第15天的9点30
0 30 9 15 * ?
At 6 pm on the last day of every month
7.每个月最后一点的下午6点
0 0 18 L * ?
At 6 pm on the 3rd to last day of every month
8.每个月的第三天到最后一天的下午6点
0 0 18 L-3 * ?
//问题 L-3和3-L有区别吗?
At 10:30 am on the last Thursday of every month
9.每个月的最后一个星期四的早上10点
0 30 10 ? * 5L
At 6 pm on the last Friday of every month during the years 2015, 2016 and 2017
在2015-2017年中,每个月的最后一个星期五的下午6点
0 0 18 ? * 6L 2015-2017
At 10 am on the third Monday of every month
每个月的第三个星期一的早上10点钟
0 0 10 ? * 2#3
At 12 am midnight on every day for five days starting on the 10th day of the month
从每个月的第十天开始,每天中午12点触发,每5天执行一次。(博主第一次翻译错了,以为是从10号-15号,for 5 days 翻译成持续5天)
0 0 12 10/5 * ?
总结:
写好corn表达式主要需要明确好频率
区分好DAY OF MONTH 和 WEEK OF DAY
可以根据一些测试网站,进行测试。