Cron 表达式学习笔记
1. 概述
Cron 表达式是一种应用很广泛的表示时间规则的方式,能够通过简单的字符串来提供丰富的含义。
基本结构
Second Minute Hour Day Month Week Year
其中 Year 字段是可选的,不写代表包含所有年份。我们一般也没有需要特别指定某些年份,所以通常 Year 都是省略的。
举一个最常见的情况,如果我们想要表示 每天0点,就可以这么写 Cron 表达式: 0 0 0 * * ?
。
问号的含义
注意到,上述例子里,Day 和 Month 都填的是星号(*),这个比较好理解,代表全匹配所有的天和月份,但是 Week 这里写的是问号(?),含义是什么呢?
这是因为 Week 和 Day 存在互斥关系,不可以同时设定规则,一旦有一方设定了,另一方就不能设定,这时候就使用问号来代表一种 “随便什么都可以” 的意思。
上面的例子里冲突不够明显,我们来看这个例子:0 0 0 1 * ?
,它的含义是 每月1号0点,可是每月1号是周几这是不确定的,所以 Week 这里得填 ?,代表随便周几都行。
再比如: 0 0 0 ? * 1
,含义是 每周日的0点 (星期从周日开始,1代表周日),同样的,由于每周日对应几号这个是不确定的,所以 Day 这里就填了了一个 ? ,代表随便几号都行。
实用工具
我们可以利用一些工具来进行 Cron 表达式的生成和检查,也可以帮助自己的学习,随时进行验证, 比如这个网站:https://www.freeformatter.com/cron-expression-generator-quartz.html 。
2. 细节
接下来展开来看一下每个字段的细节。
Second
以下用 x, y, z 来代表一个 0-59 的数字。
- x : 第 x 秒这一个时间点
- * : 所有秒
- x,y,z : 第 x ,y 和 z 秒这三个时间点
- x-y : 从 x 秒到 y 秒的每一秒
- x/z : 从 x 秒开始,每隔 z 秒一次(注意如果 x = 0,也可以写成 */z,效果一样)。
- x-y/z : 从 x 秒开始,到 y 秒结束,每隔 z 秒一次。
Minute
同 Second。
Hour
基本同 Second 和 Minute,只是数字的取值范围在 0-23。
Day
- 数字的用法同上,注意取值范围 1-31,某些月份天数不太一样。
- L : 这个月最后一天
- xW : 本月最接近第 x 天的工作日(这个有点秀)。
- LW : 本月最后一个工作日。
Month
- 数字用法同上,取值范围 1-12
- 也可以用字符串 : “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC”
Week
- 数字用法同上,取值范围 1-7,注意从周日开始
- 也可以用字符串 : “SUN, MON, TUE, WED, THU, FRI and SAT”
- x#y : 本月的第 x 个周 y,比如母亲节是第二个星期日,就可以表示为:2#1
3. 一些实例
举一些例子加深一下理解:
Cron 表达式 : 含义
11 11 11 * * ?
: 每天的 11:11:11
0/5 * * * * ?
或者 */5 * * * * ?
: 从0秒开始,每隔5秒一次
0 0 8-18 * * ?
: 每天的8点到18点的准点
0 30 10,14,16 * * ?
: 每天的10、14、16点的30分
0 5/10 * * * ?
: 从5分开始,每隔10分钟一次
0 0 12 ? * WED
: 每周三的中午12点