Cron 表达式学习笔记

Published: Creative Commons Licence

  • Categories:
  • Tags:

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点