Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域(* * * * * ? *)。其中的第4个和第6个域比较特殊(day of month day of week),第7个域可以省略(year)。
秒 | 分 | 时 | 日(月) | 月 | 日(周) | 年 |
* | * | * | * | * | ? | * |
以上表达式表示每一秒执行一次,Cron表达式可以分为以上7个部分(年可以省略,所以6个部分也行),每个部分的取值如下表所示:
名称 | 是否必须 | 允许的值 | 可以出现的特殊字符 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日(月) | 是 | 1-31 | , - * ? / L W C |
月 | 是 | 0-11 or JAN-DEC | , - * / |
日(周) | 是 | 1-7 or SUN-SAT | , - * ? / L C # |
年 | 否 | 为空或者1970-2099 | , - * / |
特殊字符中的“C”还没有在实际情况中遇到过,也基本不会用到;与日历关联有关系,本文不做介绍。
一、可以通用的特殊字符,- * / 这4个字符可以出现在任何一个部分
1、逗号,
逗号表示指定多个时间
5,6,7 * * 10,12 * ? * | 在每月10号和12号每分钟的第5、6、7秒执行 |
* 30,45 * * * ? * | 在第30分钟和第45分钟的每秒执行 |
0 0 12 ? * SUN,MON * | 在星期天和星期一的12点0分0秒执行 |
2、减号-
减号表示一个时间范围
5-10 * * 10-12 * ? * | 在每月10号到12号每分钟的第5-10秒执行 |
* 30-45 * * * ? * | 在30分钟到45分钟之间每秒执行 |
0 0 * ? * 1-4 * | 在星期天到星期三的整点执行(星期天是星期的开始) |
3、星号*
星号表示所有允许的值都执行,即等价与逗号分割所有允许都值
* * * * * ? * | 每一秒执行一次 |
* * * 15 * ? * | 在每月15号都每一秒都执行 |
0 * 12 ? * MON * | 在星期一的12点每分钟执行一次 |
4、斜杆/
斜杆表示从第几(秒分时日月年)开始,每隔几(秒分时日月年)执行一次
5/10 * * * * ? * | 每分钟的第5秒开始每隔10秒执行一次(第5秒也会执行) |
0 30/5 * 20 * ? * | 在每月20号的每个小时,第30分钟开始每隔5分钟执行一次 |
0 0 12/1 * * ? * | 每天12点开始每隔1小时执行一次 |
二、关于问号“?”,看完上面的通用特殊字符,肯定对出现对问号“?”产生了疑惑
问号只能出现在第4个区域第6个区域,即按月表示的天(day of month)和按周表示的天(day of week),记住这个规则即可如果day of month 出现了“?” 那day of week就一定不能是“?”,反之亦然。“?”在整个表达式中至少出现一次,有且仅能出现一次,通俗的说就是天你是要按照月计算还是按照周计算。
掌握上面的内容基本就在实际中就够用了,但是程序员都是为了追求完美的。
三、Day of month 中的 L W
1、L 每月的最后一天
理解起来很简单:月份的天数不一致有的31天,有的30天还有闰年和平年的2月份。
* * * L * ? * 每月的最后一天每秒都执行
* * * L-5 * ? * 月底前五天每秒都执行
2、W 工作日的意思
LW表示每月的最后一个工作日(星期五):* * * LW * ? *
5W表示离5号最近的工作日:* * * 5W * ? *
四、Day of week 中的 L #
1、L 每月最后一个星期几
* * * ? * 4L * 表示每月的最后一个星期三
2、# 在每月的第几个星期几(一个月不会超过5个星期)
* * * ? * 1#3 * 表示第3个星期天
五、实用例子,我以前也是直接看别人文章的这个部分
表达式 | 含义 |
---|---|
0 0 12 * * ? | 每天的12点执行 |
0 15 10 ? * * | 每天的10点15分执行 |
0 15 10 * * ? | 也是每天的10天15分执行 |
0 15 10 * * ? * | 还是每天的10点15分执行 |
0 15 10 * * ? 2020 | 2020年的每天的10点15分执行 |
0 * 14 * * ? | 每天14点的每分钟执行 |
0 0/5 14 * * ? | 每天的14点开始,14点55分结束每隔5分钟执行一次 |
0 0/5 14,18 * * ? | 每天的14点开始,14点55分结束每隔5分钟执行一次,以及每天的18点开始,18点55分结束每隔5分钟执行一次 |
0 0-5 14 * * ? | 每天的14点0分到14点5分钟之间每分钟执行一次 |
0 10,44 14 ? 3 WED | 3月份每个星期三的14点10分和14点44分执行 |
0 15 10 ? * MON-FRI | 星期一到星期五的10点15分执行 |
0 15 10 15 * ? | 每月15号的10点15分执行 |
0 15 10 L * ? | 每月最后一天的10点15分执行 |
0 15 10 ? * 6L | 每月最后一个星期五的10点15分执行 |
0 15 10 ? * 6L 2020-2025 | 2002年到2005年的每月最后一个星期五的10点15分执行 |
0 15 10 ? * 6#3 | 每月第三个星期五的10点15分执行 |
0 0 12 1/5 * ? | 每月1号开始每隔5天的12点执行 |
0 12 12 12 12 ? | 12月的12号的12点12分执行 |