Cron表达式的格式介绍,自动生成和示例

文章目录

Cron表达式的格式介绍,自动生成和示例

1、什么是cron表达式

cron表达式是一种用于设置定时任务的语法规则。它由6个字段组成,分别表示秒、分、小时、日期、月份和星期几。每个字段都可以设置一个数字、一组数字(用逗号分隔)、一段数字范围(用短横线分隔)、通配符(表示任意值)或者特定的字符(如星期几的英文缩写)。以下是cron表达式的语法规则:

java 复制代码
  说明:
  Java(Quartz)
  *    *    *    *    *    *    *
  -    -    -    -    -    -    -
  |    |    |    |    |    |    |
  |    |    |    |    |    |    + year [optional]
  |    |    |    |    |    +----- day of week (1 - 7) sun,mon,tue,wed,thu,fri,sat
  |    |    |    |    +---------- month (1 - 12) OR jan,feb,mar,apr ...
  |    |    |    +--------------- day of month (1 - 31)
  |    |    +-------------------- hour (0 - 23)
  |    +------------------------- min (0 - 59)
  +------------------------------ second (0 - 59)

2、 Cron表达式各个符号的意义

各个单位值中的特殊字符,是什么意思呢? 都具有的 , / * - 是什么意思呢? 日和周特有的? L和C 是什么意思呢,我们重点讲解一下。

cron 表达式 可以 全部是准确的合法数字,也可以全部是特殊字符,还可以合法数字与特殊字符连用, 这就是cron的强大的地方。

关于合法数字,就是生活中正常的值,不讲解, 只讲解 特殊字符。

2.1.特殊字符 *

*, 如果某个格子上的值 是 *, 就表示这个格子包含所有合法的值, 即全部值。

如果 秒格子上是 *,就表示所有的秒都可以取到, 也就是每一秒, 每一秒都会触发。

如果小时格子上是 *,就表示所有的小时都可以取到,也就是每一小时, 每一小时都会触发。

如果天格子上是 *,就表示每一天, 每一天都会触发。

2.2.特殊字符 ,

, 是给这个格子指定一个 值列表, 列表的各个值之间,用 , 进行分隔。

如 2,4,5 表示, 可以是2,也可以是4,也可以是5, 即 2时触发,4时也触发,5时也触发。

如果秒格子上是 2,4,5 则表示, 2s时,或者4s时,或者5秒时 触发。

如果天格子上是 2,4,5 则表示,2号,4号,5号都可以触发。

跟CSS样式里面的 ,表示意义一样。

2.3.特殊字符 -

-, 是中划线(大键盘数字0旁边的 -号), 用于指定一个范围。

如 2-5, 表示2和3和4和5, 即2,3,4,5 , 是范围时的一种简写形式。

如果秒格子上是 2-5,则表示, 第2秒,第3秒,第4秒,第5秒时触发。

如果月格子上是 2-5, 则表示 第2月,第3月,第4月,第5月时触发。

如果周格子上是 2-5,则表示 这个月的 第二周,第三周,第四周,第五周 时触发。 (注意,有可能某一年的2月28天时只有4个周,没有第五个周,所以一定要注意,表达式本身是否合理)

2.4.特殊字符 /

/, 用于递增, 即如 秒格子上的 0,15,30,45 就可以写成 0/15 ,从0开始,每次递增15, 翻译成中文就是每隔 15的意思。

所以,/ 表示的是每隔多少的意思。 A/B, 开始的点是A,间距是B.

如果秒格子上是 0/15, 则表示 从0秒开始,每隔15秒执行一次。

如果天格子上是 1/15,则表示从 1号开始,每隔15天执行一次。 (天格子上,0/15是非法的值). 这次是1号,那么下次就是16号,再下次就可以是 1号(31天),也可以是 2号(30天),也可能是 3号(闰年2月 29天),也可能是4号(平年2月 28天),

一定是间隔15天的,并不一定还是1号循环回来。

2.5.特殊字符 ?

? 只能放置于 日或者周上面。 注意,秒,分,时,月,年 这五个值是不会受其他的单个值影响的, 即秒上面是3,

那么无论其他格子上的值是多少,这个秒上面的3都是对的。 但是,日和周就不一样了, 他们两个是可以互相影响的。

如, 日格子上指定值为 31, 周格子上指定 为第一周, 那么这个cron 表达式 按照谁的来呢? 是按照日来,还是按照周来,

还是变成一个死掉的表达式? 都 不可以。 为了避免这样的情况发生, 所以出现了 ? 表达式, 表示放弃维护表达式,

即我并不关心这个值是多少。

如果 日格子上是 ?, 就表示告诉表达式, 你不用管我,你只看周就可以了。

如果 周格子上是 ?, 就表示告诉表达式, 你不用管我, 你只看 日就可以了。

所以,如果当 日上面的值不是?时, 周上面的值肯定是 ?, 如果当周上面的值不是?时,日上面的值肯定是? 号。

但两个格子,不能同时是 ?时。

如果式子是: * * * 3-5 * ?, 此时周上面是?,周放弃维护, 只看日就可以了。 每个月的3号到5号触发。

如果式子是: * * * ? * 3, 此时日上面是?,日放弃维护,只看周就可以了, 表示 每周的星期二触发。

2.6.特殊字符 L

L 是 last,最后一个的意思。 只能应用于 日和周上面, 表示最后一天,最后一周。

当然,你也可能会说,秒也有最后一秒啊,小时也有最后一小时啊,为什么不可能用在秒和小时上面,

因为最后一秒是确定的,就是59s, 最后一小时也是确定的,就是23小时, 最后一月也是确定的,就是12月,

直接写确切的数字即可, 不需要用 L 。

日上面的 L,是由月来确定的, 每个月的最后一天是不确定的, 如1月最后一天是31,4月最后一天是30,

用L 这个特殊字符,就不需要开发者自己去写逻辑判断日了。

周上面的 L, 也是由月来确定的, 每个月的最后一周是不确定的, 每个月可能有4周,也可能有5周,还可能有6周,

这都是不确定的,用L 这个特殊字符,就不需要开发者自己去写逻辑判断周了。

日格子上面想表达最后一天的概念时, 只能单独写一个 L, 不能再写其他的东西了。

周格子上面想表达最后一周的概念时, 可以只写一个L, 表示最后一周的那几天,都触发,

也可以确切地表示最后一周的星期几触发, 需要添加 数字

如 2L, 表示最后一周的星期一, 3L 表示最后一周的星期天, 最后一周的其他天并不能触发。

如果是6L, 而这个月最后一周没有周五,到周三就结束了,那么就去找上一周的周五。

2.7.特殊字符 w

W,只能应用于 日 格子上。 W,表示的是 work, 工作日。 指的就是周一到周五,正常的工作日。

注意,这儿工作日与国家法定节假日是没有关系的,只是星期上的工作日的概念。

前面需要加上一个数字, 数字天W, 表示距离某天最近的工作日。

如 15W,

如果这一月的15号这一天是星期五,正常的工作日,那么就在这一天触发任务。

如果这一月的15号这一天是星期六,不是正常的工作日, 它距离上一个工作日14号(星期五)相差1天,距离下一个工作日17号(下个星期一) 相差2天, 那么就在离它最近的那一个工作日,即14号触发。

如果这一月的15号这一天是星期日,不是正常的工作日,它距离上一个工作日13号(星期五) 相差2天,距离下一个工作日16号(星期一) 相差1天, 那么就在离它最近的那一个工作日,即16号触发。

银行业务,或者公司薪资业务常常用 w 这个特殊字符

2.8.特殊字符 LW

LW 这个组合字符 ,只能用于周格子上, 表示本月的最后一个工作日。

L 是本周最后一个,W 表示最后一个工作日, 组合起来,就是 本月的最后一个工作日。

常常用于统计 本月的出勤,流量等统计业务中。

2.9.特殊字符#

#只能用于 周格子上, 表达第几周的星期几的概念。

由两个部分组成 A#B, A表示星期几, B表示第几个, 即 第B周的星期A 。

常常用于西方不固定的节日上。

如母亲节, 5月的第二个星期天, 那么就可以写成 * * * ? 5 1#2

如父亲节,6月的第三个星期天, 那么就可以写成: * * * ? 6 1#3

3、常见的表达式示例

在线Cron表达式生成器

(1)0/2 * * * * ? 表示每2秒 执行任务

(1)0 0/2 * * * ? 表示每2分钟 执行任务

(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务

(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业

(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作

(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

(6)0 0 12 ? * WED 表示每个星期三中午12点

(7)0 0 12 * * ? 每天中午12点触发

(8)0 15 10 ? * * 每天上午10:15触发

(9)0 15 10 * * ? 每天上午10:15触发

(10)0 15 10 * * ? 每天上午10:15触发

(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发

(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发

(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发

(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发

(18)0 15 10 15 * ? 每月15日上午10:15触发

(19)0 15 10 L * ? 每月最后一日的上午10:15触发

(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发

(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发

(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

相关推荐
TheITSea24 分钟前
云服务器宝塔安装静态网页 WordPress、VuePress流程记录
java·服务器·数据库
AuroraI'ncoding31 分钟前
SpringMVC接收请求参数
java
数据小爬虫@36 分钟前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
高 朗1 小时前
【GO基础学习】基础语法(2)切片slice
开发语言·学习·golang·slice
九圣残炎1 小时前
【从零开始的LeetCode-算法】3354. 使数组元素等于零
java·算法·leetcode
寒笙LED1 小时前
C++详细笔记(六)string库
开发语言·c++·笔记
IT书架1 小时前
golang面试题
开发语言·后端·golang
初遇你时动了情1 小时前
uniapp 城市选择插件
开发语言·javascript·uni-app
天天扭码2 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
程序猿小柒2 小时前
leetcode hot100【LeetCode 4.寻找两个正序数组的中位数】java实现
java·算法·leetcode