轻松搞定cron表达式

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 执行

“年份” 是可选的,可以指定,也可以不指定。如果指定的话,表示的是这一年的定时任务;不指定的话,默认就是每年的定时任务。

字段允许值如下

位置时间域允许值特殊字符
10-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 43 月每周三的 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

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值