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

  • 相关阅读:
    通过actionlib控制jaco机械臂
    actionlib学习
    配置 jaco机械臂 ros环境
    ubuntu14.04标题栏显示上下网速
    linux下alsa架构音频驱动播放wav格式文件
    ros语音交互(五)移植科大讯飞语音识别到ros
    ubuntu14.04 wifi驱动
    Ubuntu14.04使用apt-fast来加快apt-get下载的教程
    ROS语音交互(四)接入图灵语义理解
    相比传统游戏,区块链游戏的价值在哪里?
  • 原文地址:https://www.cnblogs.com/knowledgesea/p/4705796.html
Copyright © 2011-2022 走看看