• (备忘)cron表达式的用法


    一、结构

    cron表达式用于配置cronTrigger的实例,实现任务调度的功能。  

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

    (每个字段之间最好只留有一个空格(因为spring中貌似在意空格,多个空格会出现错误);字段中的特殊字符区分中英文,必须是中文;Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感)

    (1) Seconds Minutes Hours DayofMonth Month DayofWeek Year(秒 分 时 日期 月份 星期 年份)

    (2)Seconds Minutes Hours DayofMonth Month DayofWeek(秒 分 时 日期 月份 星期 )

    注意:

    spring的schedule值支持6个域的表达式,也就是不能设定年,如果超过六个则会报错。  

     @Scheduled(cron = "0 0/5 * * * ?") 
        public void s10(){
           /* 任务内容*/
        }
     如cron = "0 0/5 * * * ?" 写成 cron = "0 0/5 * * * ? 2019" 运行会出错,如下图所示:

     

    二、格式说明

    字段名

    允许的值

    允许的特殊符号(仅列部分常用)

    Seconds        秒

    0~59的整数

      *    -    ,    /

    Minutes         分

    0~59的整数

      *    -    ,    /

    Hours            时

    0~23的整数

      *    -    ,    /

    DayofMonth   日期

    1~31的整数(注意每个月的天数)

      *    -    ,    /    ?    L  W  C

    Month           月份

    1~12的整数或JAN~DEC

      *    -    ,    /

    DayofWeek    星期

    1~7的整数或SUN~SAT(1对应SUN

      *    -    ,    /    ?    L   C # 

    Year              年

    1970~2099的整数

      *    -    ,    /

      

    三、特殊字符的含义

    (1)星号(*): 表示可以匹配该域的所有值;

      例如,"0 0 13 * * ?"表示每天的13点执行一次。

    (2)问号(?):只能用在日期和星期中,表示不指定值;

      注意事项:

      1、它与*的区别是,并不能匹配到该域上的所有值,例如指定了3月份每个周五,那么3月份的周五可能只有4个值;

      2、当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为“?”

      3、出现的时候只能出现一次

      4、最好是设置表达式必须出现一次该符号,因为在Java(Quartz)中如果没有一次该符号的出现,会提示表达式错误而无法解析

      例如,"0 0 5 6 * ?"表示每个月6日5点钟执行而无论周几,"0 0 5 ? * 3"表示每个周三5点钟执行而无论是几号。

    (3)减号(-):表示匹配该域上的一个范围;

      例如,"0 30 9-15 ? * *"表示每天的9:30-15:30每小时执行一次,"0 1-5 * ? * 1"表示每周日每个小时的1-5分钟每分钟执行一次。

      例如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

    (4)逗号(,): 表示枚举值;

      例如,"0 0 8,16,23 ? * 1,7"表示每个周六日的8点、16点、23点各执行一次。

    (5)斜杠(/):表示起始时间和间隔时间;

      x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45分,而5/15在分钟字段中表示5,20,35,50分,你也可以使用*/y,它等同于0/y;

      例如,"0 0 3/5 * * ?"表示每天3点开始执行,每隔5个小时执行一次,即3点、8点、13点、18点、23点各执行一次

      注意:日期、月份、星期中的x是从1开始,不能写成0/3这种的,会出错

      

    (6)井号(#):只能用于星期字段上,#后面的数字表示第几周,如果不存在这个周的值,则不执行;

      例如,"0 0 0 ? * 5#2"表示每个月第2个周四零点执行,"15 30 6 ? * 7#5"表示每个月第5个周六6:30:15执行,如果某个月不存在第5个周六,则不执行。

    (7)L: 只能用于日期和星期字段中,代表“Last”的意思,但它在两个字段中意思不同。

    • 在日期中,“L”表示一个月的最后一天,31号、30号、28号或者29号,月份不同日期不同。
    • 在星期中中,“L”表示一个星期的最后一天,也就是“7”或者“SAT”,就是星期六。
    • 但是如果“L”前有具体内容,它就有其他的含义了。例如:日期中“6L”表示这个月的倒数第六天;星期中“FRIL”表示这个月的最后一个星期五。

      注意:在使用“L”参数时,不要指定列表或者范围,这样会出现问题

      例如,"0 0 23 L * ?"表示每月最后一天的23点执行,"0 0 23 ? * L"表示每周六的23点执行,"0 0 23 ? * 3L"表示每月最后一个周二的23点执行。

    (8)W: 该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日

      例如15W表示离该月15号最近的工作日

      • 若15号是周六,则15W的结果就是14号
      • 若15号是周天,则15W的结果就是16号
      • 若15号是周一至周五的某一天,则15W的结果就是15号

      注意事项

      1. 但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。
      2. W字符串只能指定单一日期,而不能指定日期范围。

     (9)LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

    (10)C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。

      (这个字符貌似不常用,不是太明白这个的用法,有大神的话期待解释一下)

      如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)

    四、一些例子

    意义 表达式
     每隔5秒钟执行一次            */5  * *  *  *  ?
     每半分钟触发任务     30 * * * * ?
     每隔1分钟执行一次            0 */1 * * *  ?或者0 * * * * ?
     每天1点执行一次     0  0  1  *  *  ?
     每月最后一天23点执行一次     0 0 23 L * ?
     每周六8点执行一次     0  0  8  ?  *  L
     每月最后一个周五,每隔2小时执行一次     0  0  */2  ?  *  6L
     每月的第三个星期五上午10:15执行一次     0  15  10  ?  *  5#3
     在每天下午2点到下午2:05期间的每1分钟执行     0  0-5  14  *  *  ?
     表示周一到周五每天上午10:15执行     0  15  10  ?  *  2-6或者0 15 10 ? * MON-FRI
     每个月的最后一个星期五上午10:15执行     0  15  10  ?  *  6L 
     每天上午10点,下午2点,4点执行一次     0  0  10,14,16  * * ?
     朝九晚五工作时间内每半小时执行一次     0  0/30  9-17  *  * ?
     每个星期三中午12点执行一次     0  0  12  ?  *  4
     每年三月的星期三的下午2:10和2:44各执行一次       0  10,44  14  ?  3  4 
     每月的第三个星期五上午10:15执行一次     0  15  10  ?  *  6#3
     每月一日凌晨2点30执行一次     0  30  2  1  *  ?
     每分钟的第10秒与第20秒都会执行     10,20  *  *  *  * ?
     每月的第2个星期的周5,凌晨执行     0  0  0  ?  *  6#2
     2002年至2005年的每月的最后一个星期五上午10:15触发     0 15 10 ? * 6L 2002-2005
     每个月最后一个工作日的10点15分0秒触发任务     0 15 10 LW * ?

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    五、一些CRON在线校验工具

    http://www.bejson.com/othertools/cronvalidate/

    https://tool.lu/crontab/

  • 相关阅读:
    Spark随机深林扩展—OOB错误评估和变量权重
    Spark随机森林实现学习
    RDD分区2GB限制
    Spark使用总结与分享
    Spark核心—RDD初探
    机器学习技法--学习笔记04--Soft SVM
    机器学习技法--学习笔记03--Kernel技巧
    机器学习基石--学习笔记02--Hard Dual SVM
    机器学习基石--学习笔记01--linear hard SVM
    特征工程(Feature Enginnering)学习记要
  • 原文地址:https://www.cnblogs.com/congcongdi/p/11552257.html
Copyright © 2020-2023  润新知