• 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, - * / 四个字符标准实现不支持此字段。

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

  • 相关阅读:
    本地上传代码文件到github的一些问题处理
    Springboot面向高校应届毕业生的服务系统39t7k计算机毕业设计-课程设计-期末作业-毕设程序代做
    SpringBoot整合原理解析
    Yunfly 一款高效、性能优异的 node.js web 框架
    迷宫寻路:(深搜广搜)
    Redis系列5:深入分析Cluster 集群模式
    OSINT技术情报精选·2024年4月第3周
    数据预处理大全
    SUB-1G SOC芯片DP4306F 32 位 ARM Cortex-M0+内核替代CMT2380F32
    DataLoader的使用
  • 原文地址:https://blog.csdn.net/qq_43781399/article/details/126370826