quartz 時間表達式----- 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章