Cron表达式详解(配合例子)

Cron 表达式

在进行定时任务的创建的时候,cron是计划任务的表达式

本文意在快速的分析列出cron表达式的书写规则与含义

1、基本格式

cron表达式格式:
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

  • 六位的 0 0 12 * * ?(每天的中午12点触发)

    Seconds Minutes Hours DayofMonth Month DayofWeek

  • 七位的0 0 12 * * ? *(每天的中午12点触发)

    Seconds Minutes Hours DayofMonth Month DayofWeek Year

简单解释下以六位(常用)的为例

0 0 12 * * ? 中的六位,分别对应Seconds Minutes Hours DayofMonth Month DayofWeek

数字对应位含义
0Seconds(秒)第0秒
0Minutes(分)第0分
12Hours(时)12时(24小时制)
*DayofMonth(一个月的第几天)一个月的每一天
*Month(月)每一个月
DayofWeek(周几)一周中的每一天

整体来看就是每天的12:00进行任务触发,这种是最简单最易理解的一种形式。

要注意的是,在 秒 分 时 后边跟的是 一个月的第几天 而非 记忆的时候注意别搞混,还有DayofWeek的取值定义,不同处有不同定义,要先确认1代表周一还是周日

其中的* 二者都是每一天的意思,但又有使用上的区别,下边会进行详细解释。

2、一些特殊值的含义

每个位除了数字和 * 外还有其他的可选值,学习特殊字符的含义是用好Cron表达式的基础

四种通用特殊字符

特殊符号用法例子
*匹配该域的任意值Minutes域使用*, 即表示每分钟都会触发事件
-表示范围Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
/表示数值的增量Minutes写上0/5表示从0分开始,每隔5分钟
,表示列出枚举值Minutes域使用5,20,第5分钟和第20分钟分别触发

五种有使用限制的特殊字符

限制字符指的是只能在固定的几个域使用,主要用于满足一些特殊场景

?

​ 含义: 匹配该域的任意值

​ 限制:只能用在DayofMonth和DayofWeek两个域

​ 特殊解释:分析Cron表达式,可以发现 DayofMonthDayofWeek是会进行冲突的,比如要实现这样一个表达式,去表达每周五下午六点,要怎么表示,核心在于 DayofMonth怎么去标识,写具体值不合适,写*就变成了每一天,和每周五出现了冲突。这时就用 ?表达一种次要通配,辅助*进行含义的表达,0 0 18 ? * 6,表达是 0秒,0分,18时,一个月的任意一天,每个月,没周五。

​ 例子参考理解:

​ - “0 15 10 ? * *” 每天上午10:15触发

​ - “0 15 10 * * ?” 每天上午10:15触发

​ - “0 15 10 ? * 2-6” 周一至周五的上午10:15触发

​ - “0 15 10 15 * ?” 每月15日上午10:15触发

L

​ 含义:表示最后,

​ 限制:只能出现在DayofWeek和DayofMonth域

​ 解释:如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。在DayofMonth用L,意味当前月的最后一天

​ 例子参考理解:

​ - “0 15 10 L * ?” 每月最后一日的上午10:15触发

​ - “0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发

W

​ 含义:表示有效工作日(周一到周五),

​ 限制:只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。

​ 特殊解释:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份

LW

​ 含义:表示在某个月最后一个工作日,即最后一个非周六周末的日期。

​ 限制:只能出现在DayofMonth域

#

​ 含义:用于确定每个月第几个星期几

​ 限制:只能出现在DayofWeek域

​ 补充解释:4#2,表示某月的第二个星期三。

​ 例子:

​ - “0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发

3、各个域的取值范围

取值范围允许的特殊字符是否必填备注
秒-Seconds0~59的整数, - * / 四个字符
分钟-Minutes0~59的整数, - * / 四个字符
小时-Hours0~23的整数, - * / 四个字符
日期-DayofMonth1~31的整数(但是你需要考虑你月的天数), - * / ? L W C 八个字符?LW只有部分软件实现了
月份-Month1~12的整数 或者 JAN-DEC, - * / 四 个字符
星期-DayofWeek1~7的整数 或者 SUN-SAT, - * / ? L C # 八个字符? L #只有部分软件实现了, Linux 和 Spring 的允许值为0-7,0和7为周日;Quartz的允许值为1-7,1为周日
年-Year1970~2099, - * / 四个字符标准实现不支持此字段。

使用的时候还是需要查询具体的软件实现,来确认一些域的具体取值范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值