cron表达式的详细介绍(各域说明以及举例说明)

2年前 (2022) 程序员胖胖胖虎阿
390 0 0

cron表达式的详细介绍(各域说明以及举例说明)

  • 1. 关于 cron
    • 1.1 前言
    • 1.2 使用 cron 的注意点
    • 1.3 举个例子
  • 2. cron表达式的格式(或语法)
  • 3. 各域的含义——如何取值?
    • 3.1 各域的含义介绍
    • 3.2 特殊字符的含义
    • 3.3 简单举例说明及使用效果

1. 关于 cron

1.1 前言

  • 这两天在弄定时任务,感觉 cron 表达式挺有意思,有必要写下来供大家参考学习。
  • 了解过 crontab 的应该都知道 crontab 怎么配置定时任务,其实cron 与 crontab 差不多,但需要注意的是:cron 表达式从左往右,从开始;而 crontab 则是从分钟开始的。

1.2 使用 cron 的注意点

  • cron 表达式是一个字符串,包含五个七个空格分隔的字段(每种软件不一样,需要注意:LinuxJava(Spring)Java(Quartz) 的区别,本文主要以Java为主,说一下 cron 表达式),表示一组时间,通常作为执行某个程序的时间表。
  • 注释以注释标记#开始,并且必须单独在一行上。

1.3 举个例子

  • 看下面的错误信息:
    cron表达式的详细介绍(各域说明以及举例说明)
    cron表达式的详细介绍(各域说明以及举例说明)
  • 原因是Spring 的表达式 只是 cron表达式的子集,它不包含year字段,并且不能使用部分特殊字符,比如上面的 #。
  • 举这个两个报错信息是干什么呢?意思是下面关于的特殊字符都会介绍,但是有可能你在使用的时候,因为使用的软件不一样,可能效果没用达到,但是不代表语法有误,你要分场合分情况使用,这点在此特别说明一下!

2. cron表达式的格式(或语法)

  • 比如,cron = "0 30 * * * ? " 代表啥意思呢?往下看,看完你就会明白了!
  • Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
 ① Seconds Minutes Hours DayofMonth Month DayofWeek 
 
 ② Seconds Minutes Hours DayofMonth Month DayofWeek  Year
  • 即:
秒  分钟  小时  日期   月份  星期  年(年份可留空,通常省略)

3. 各域的含义——如何取值?

3.1 各域的含义介绍

每一个域都使用数字,但还可以出现下面表格里的特殊字符,如下表格:

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

3.2 特殊字符的含义

  含义 解释说明
* 表示匹配该域的任意值 如果在 Minutes 域使用 * , 则表示每分钟都会触发事件。
, 表示列出枚举值 如果在Hours 域中使用 9,10 则表示上午9点和10点会出发事件。
- 表示范围 如果在 Seconds 域中使用 5-8 ,则表示 5秒、6秒、7秒、8秒 时间点会触发事件
/ 表示起始时间开始触发,然后每隔固定时间触发一次 如果在 Seconds 域中使用 6/10 ,则表示从06秒开始,每10秒执行一次,即:会在 06,16,26,36,56时间点触发事件,也就是说:在 Seconds 域中配置 6/10 和 配置 06,16,26,36,56 效果一样
? 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。(可以理解成是 * 的第二种特殊写法) 例如:15 30 12 9 * ? ,表示的是每月9号的中午12:30:15发工资,此时 DayofWeek 这个域就要用 ? 而不能用 *(表示每周每天,而我们只要9号一天)
L 表示最后Last,只能出现在 DayofWeek 和 DayofMonth 域。 ① 用在DayofMonth 域中(直接写L),可以指定一个月的最后一天;② 用在 DayofWeek 域中指定当月最后一个星期X(比如:2L指本月最后一个星期二)
W 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件 例如:在 DayofMonth 使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
LW 这两个字符可以连用,表示在某个月最后一个工作日,即当月最后一个星期五。
C 代表“Calendar”的意思。但是没发现加C和不加C的区别。 例如:15 30 12 9 * ?,用9和9C的效果一样。
# 用于确定每个月第几个星期几,只能出现在DayofWeek域。 比如,4#2,表示某月的第二个星期三(4代表星期三,2代表第几个)。例如:15 30 12 ? * 4#2表示:每月第二个星期三的12:30:15秒执行

3.3 简单举例说明及使用效果

  • 比如:cron = “6/10 * * * * ?”,06秒开始,然后每次间隔10秒
    cron表达式的详细介绍(各域说明以及举例说明)
    为了方便,接下来我们举例都直接在线验证效果啦!
  • 比如:0 10,30 12 * * ? 或者 0 10,30 12 ? * *,每天12点的10分和30分执行任务
    cron表达式的详细介绍(各域说明以及举例说明)
  • 比如:0 30 14-17 * * ? *,每天下午14点到17点中的半点执行
    cron表达式的详细介绍(各域说明以及举例说明)
    好了,就简单举几个就行了,比葫芦画瓢的东西,自己看着画吧
    • 推荐几个自动生成以及验证cron的网址:
    • https://www.matools.com/cron.
    • http://cron.ciding.cc/.
    • https://cron.qqe2.com/.
    • https://www.bejson.com/othertools/cron/.
  • 上述网站,喜欢就用,不喜欢别吐槽,自己厉害也不用他们,自己再厉害也可以做个给我们大家!

相关文章

暂无评论

暂无评论...