cron 的简介
Cron 表达式是一种用于指定定时任务的时间表达式,常用来描述一个定时任务应该在哪些时间点执行。它由 6~7 个用空格隔开的字段组成,分别表示秒、分、时、日、月、星期、年份(可省略)。
cron 表达式的组成
表达式组成:“秒 分 时 日 月 星期几 [年份],其中 “年份” 是可选的,一般不指定。
23 10 13 6 5 ?
| | | | | |
| | | | | ---------- 星期几 (1~7,1代表周日,2代表周一,以此类推)
| | | | ---------- 月份 (1~12)
| | | ---------- 月份中的日期 (1~31)
| | ----------- 小时 (0~23)
| ------------- 分钟 (0~59)
------------- 秒 (0~59)
# 该表达式的意思是 每年的 5月6日 13:10:23 执行
“年份” 是可选的,可以指定,也可以不指定。如果指定的话,表示的是这一年的定时任务;不指定的话,默认就是每年的定时任务。
字段允许值如下
位置 | 时间域 | 允许值 | 特殊字符 |
---|---|---|---|
1 | 秒 | 0-59 | , - * / |
2 | 分钟 | 0-59 | , - * / |
3 | 小时 | 0-23 | , - * / |
4 | 日期 | 1-31 | , - * / ? L W |
5 | 月份 | 1-12 | , - * / |
6 | 星期 | 1-7 | , - * / ? L # |
7 | 年份(可选) | , - * / |
表达式中的特殊字符的含义如下
符号 | 语义 |
---|---|
* | 表示对应时间域的每一个时刻, 例如,在分钟字段时,表示“每分钟” |
- | 表达一个范围, 如在小时字段中使用 “9-11”,则表示从 9 点到 11 点,即 9,10,11 |
, | 表达一个列表值, 如在小时字段中使用 “9,10,14”,则表示上午9点,10点,下午2点 |
? | 该字符只在日期和星期字段中使用,它表示不指定值,相当于一个占位符,防止日期和星期冲突 |
/ | 该符号前表示开始时间,符号后表示每次递增的值。 即 x/y 表达一个等步长序列,x 为起始值,y 为增量步长值。如在秒字段中使用 0/15,则表示为 0,15,30,45 秒,而 5/15 在秒字段中表示为 5,20,35,50(从5开始,每次递增15) |
# | 该字符只用在星期字段中,“4#2” 代表第 2 个星期三,“5#4” 代表第 4 个星期四(注意在星期字段中,1 代表周日,2 代表周一,以此类推) |
L | 该字段只在日期和星期字段中使用,代表“Last”的意思, 但它在两个字段中意思不同。如果 L 用在星期字段里,则表示星期六,等同于 7 。L在日期字段中,表示这个月份的最后一天,如一月的31号,4月的30号 |
另外,L出现在星期字段里,而且在前面有一个数值x,则表示“这个月的最后一个周 x”,例如,6L 表示该月的最后星期五 | |
W | 该字符只能出现在日期字段里,必须在具体的数字之后,表示离该日期最近的工作日。 例如,15W 表示离该月 15 号最近的工作日(周一到周五),如果 15 号是在星期一到星期五中的一天,则就在 15 号触发定时任务;如果 15 号是星期六,则将在最近的工作日:星期五,即 14 号触发;如果 15 号是星期天,则在 16 号(周一)触发。但必须注意关联的匹配日期不能够跨月 |
在日期字段可以组合使用 LW,它的意思是当月的最后一个工作日。
特别注意,? 这个字符,它是一个占位符,无具体意义,因为日期和星期这两个字段比较特殊,都能表达出某一天来,如果你指定了日期就不要指定星期(星期的位置用 ? 表示)。千万不可以日期和星期两个都指定,可能会出问题,例如:你指定了日期 2024 年 5 月 12 日,这一天明明是星期日,你却指定星期为星期三,这样子就出问题了。所以,一般情况下,只需要指定日期和星期其中的一个,另外一个用 ? 表示。
常用示例
cron 表达式其实不难,我们只要记住一共 6 位或者 7 位,第 7 位 “年” 是可选的(可省略的),从左到右,跟我们表示时间的习惯相反,即 秒 分 时 日 月 星期几 [年份],星期在第 6 位,然后根据以下的例子,去验证对应的规则,即可轻松掌握。
例如:0 5 * * * ?
这个表达式,是什么意思呢?
首先,这个表达式是 6 位,即 7 位的 “年” 省略了,即每年都会执行。其次,[ 秒 ] 和 [ 分 ] 的位置分别是 0 和 5,意思是 0 秒 5 分的时候会执行。然后,看特殊字符,* 表示对应时间域的每一个时刻,简单来说,这里就是每小时、每天、每月。? 就是一个占位符,没啥意义,就是防止和 [ 日 ] 冲突的。所以,0 5 * * * ? 的意思是 每天每小时的 xx:05:00 时执行定时任务。
以下是一些常用的表达式:
表达式 | 说明 |
---|---|
0 0 11 * * ? | 每天 11 点运行 |
0 15 10 * * ? | 每天 10:15 运行 |
0 15 10 * * ? 2010 | 在 2010 年的每天 10:15 运行 |
0 * 14 * * ? | 每天 14 点到 15 点之间每分钟运行一次,开始于 14:00,结束于 14:59 |
0 0/5 14 * * ? | 每天 14 点到 15 点每 5 分钟运行一次,开始于 14:00,结束于 14:55 |
0 0/5 14,17 * * ? | 每天 14 点到 15 点每 5 分钟运行一次,此外每天 17 点到 18 点每 5 分钟也运行一次 |
0 0-5 14 * * ? | 每天 14:00 点到 14:05,每分钟运行一次 |
0 0-5/2 14 * * ? | 每天 14:00 点到 14:05,每 2 分钟运行一次 |
0 10,44 14 ? 3 4 | 3 月每周三的 14:10 分和 14:44 分,各运行一次 |
0 15 10 ? * 2-6 | 每周一,二,三,四,五的 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 2006-2008 | 在 2006,2007,2008 年每个月的最后一个星期五的 10:15 分运行 |
cron 表达式生成器
cron 表达式不一定要自己写,网上有很多 cron 表达式在线生成工具,如
https://www.bejson.com/othertools/cron/
https://www.pppet.net
http://cron.jsrun.net