zoukankan      html  css  js  c++  java
  • quartz.net 时间表达式----- Cron表达式详解

    序言

    Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无缝,说是编码艺术凝集一点不过分。

    牛逼吹完啦,我就写几个简单的cron表达式欣赏下:

    1、0/20 * * * * ? note:每20秒

    2、15 0/2 * * * ?            

    note:每小时从0分钟开始,每2分钟的第15秒,假如当前时间是20:00:00,那么他的维度就在:20:02:5,20:04:15,20:06:15 ....

    3、0 0/2 17-21 * * ?          

    note: 每天的下午5点到晚上9点,每隔2分中的第00秒,假如当前时间是20:24:52 ,那么他的时间维度在:20:26:00,20:28:00,20:30:00 ...

    看到Cron表达式的简洁与强大并存,忍不住往下深入,Go

    Cron表达式的符号、格式表格

    表1、cron表达式特殊字符意义示意表

    特殊字符

    意义

    *

    匹配所有的值。如:*在分钟的字段域里表示 每分钟

    ?

    只在日期域和星期域中使用。它被用来指定“非明确的值”

    -

    指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”

    ,

    指定几个可选值。如:“MON,WED,FRI”在星期域里表示“星期一、星期三、星期五”

    /

    指定增量。如:“0/15”在秒域意思是没分钟的0,15,30和45秒。“5/15”在分钟域表示没小时的5,20,35和50。符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)

    L

    表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五

    W

    只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的

    LW

    L和W可以在日期域中联合使用,LW表示这个月最后一周的工作日

    #

    只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三

    C

    允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)

    表2、 Cron 表达式特殊字符意义对应表

    字段

    允许值

    允许的特殊字符

    0-59

    , - * /

    0-59

    , - * /

    小时

    0-23

    , - * /

    月内日期

    1-31

    , - * ? / L W C

    1-12 或者 JAN-DEC

    , - * /

    周内日期

    1-7 或者 SUN-SAT

    , - * ? / L C #

    年(可选)

    留空, 1970-2099

    , - * /

    Cron表达式特殊字符详解

    接下来的cron表达式,我会结合着quartz来描述。首先cron表达式是有7个域的,依次分别是:秒分时日月周年,其中年是可选类型,也就是说他如果在不设定年分的情况下是每年。

    1、星号(*)

    他在每个域都可以存在,包含所有合法的值,看好这里是包含所有,意思就是说在那一个域上表示这个域上的所有值,加入在月,表示1-12,也就是说是每月,都会被执行。

    示例1:0**1*?   note:每月1号凌晨都会被执行。

    示例2:0**?**   note:每分钟的00秒被执行。

    2、问号(?)

    他在cron表达式中,必定存在,有且只有一个,且他只能在日和周的域中存在,表示,不关系这个域是什么值,看好了,跟*的包含所有值不同,他是不关系是月的哪一天或是周的哪一天。如果在周域定义具体的数值,日域必须为问号(?),如果在日域定义啦具体的数值,那么周域就必须为问号(?)。为什么,因为避免含糊不清的表达方式,比如3月的第20天,刚好是第三周的第5天,那么如果在日域定义20,周域定义5这样,就双重定义,很蛋疼。cron表达式也不允许。

    示例1:0 10 18 ? 3 WEB     note:每年3月的每个星期三,下午6点10分都会被触发

    示例2:0 10 18 15 3 ?        note:每年三月的第15天,下午6点10分都会被触发

    3、横杠(-)

    他在cron表达式中,可以存在任何域,如果存在某个域,表示起止时间,他表示一个时间段。

    实例1:0 10 18 1-5 * ?          note:每月的1号到5号(包含每月1号和5号,每月共计5天都会被触发),下午6点10分都会被触发

    实例2:0 10-15 * ? * *          note:每小时的第10分钟到第15分钟(包含每小时的第10分钟和第15分钟,每小时共计5分钟都会被触发),都会被触发

    4、逗号(,)

    他在cron表达式中,可以存在任何域,如果存在某个域,表示可选值,他是个多点的概念。

    实例1:10,20  *  * ? * *         note:每分钟的第10秒与第20秒都会被触发

    实例2:0 10,20 * 1,2 * ?          note:每月的第1天与第2天的,每小时的第10分钟与第20分钟被触发。

    5、斜划线(/)

    他在cron表达式中,可以存在任何域,表示增量,是在域中设定一个起始的值,然后每隔多少时间的概念。

    实例1:5/20 * * ? * *           note:每分钟的第5秒,第25秒,第45秒 都会被执行。

    实例2:0 * 2/2 ? *  *          note:每天的第2小时,第4小时,第6小时,第8小时 ... 第22小时的00分00秒都会被触发。

    6、井号(#)

    他在cron表达式中,只能存在周这一个域,表示第几周的星期几,如果超出范围,则忽略不记。

    实例1:* * * ? * 3#4            note:每月的第4个星期的周2,凌晨触发。

    实例2:* * * ? * 6#2            note:每月的第2个星期的周5,凌晨触发

    其它的字符,我这里就不做实例啦,对照着特殊符号表,自己来理解吧。thanks

    最后附带一个生成cron表达式的工具:http://pan.baidu.com/s/1pL7Y2uf

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/knowledgesea/p/4705796.html
Copyright © 2011-2022 走看看