1. 程式人生 > >quartz中cron表示式

quartz中cron表示式

cron是unix系統中的crontab底層任務排程所用的一種表達方式。cron在quartz和spring task等排程框架、工具中都會使用到。

 

cron表示式中共包含7個欄位(引數),分別表示秒、分、時、日、月、周、年,其中年是可選欄位。

 

下面我們來詳細介紹下這7個欄位 :

 

秒:  允許的值 0-59,可含特殊字元   -  /   ,  *

分:  允許的值 0-59,可含特殊字元   -  /   ,  * 

時:  允許的值 0-23,可含特殊字元   -  /   ,  * 

日(月中的天):允許的值 0-31,可含特殊字元  -  /   ,  * ? L  W C

月: 允許的值 1-12或JAN-DEC ,可含特殊字元   -  /   ,  * 

周(週中的天): 允許的值 1-7或SUN-SAT ,可含特殊字元    /   ,  * ? L  C #

年(可選欄位):一般不填此欄位,若填則允許的值為1970-2099,可含特殊字元   -  /   ,  *  

 

特殊字元(*) :表示存在的任意的值

特殊字元(-):表示連續區間的值,例如 5-10表示取5到10的直接的所有值(包括5和10) 

特殊字元(,):表示孤立的值列表,例如1,2,5表示取1、2、5三個孤立的值

特殊字元(/):表示從某開始間隔(步長)取值,例如 秒欄位 0/15表示從0開始每15秒取一個值,即:0、15、 30、 45。注意秒位的0/15和*/15是不同的,雖然它們都是每15秒取一個值,但是前者永遠是取第0、15、30、45秒 ,而後者表示從任意當前時間(秒)開始每15秒取一次值。例如,若當前時間的秒數為1,則*/15的取值為 1、16、31、46 秒

 

特殊字元(?):"?"表示不指定值。 "?"只能出現在日或周欄位中,且當出現在日欄位中時,周欄位就不能用"?" ,當出現在周欄位中時,日欄位中就不能用"?" 。這是因為在不同的月份中,月中的天(日)和週中的天(周)是相互衝突的,指定了日就只好忽略指定周,反過來指定了周就只能忽略指定日了。 比如,有這樣一個定時任務: 每個月的5號的早上10點整發送一封郵件給公司老總。在這個任務的cron表示式中,月份欄位為"*",日欄位為"5",那麼周欄位應該填多少呢? 可能這個月的5號正好對應為週四(那麼cron為0 0 10 5 * 4)  ,可是下個月5號呢,難道也還對應為週四嗎, 顯然不一定。

 

特殊字元(L):表示last,在日欄位中表示月中的最後一天(大月為31號,小月30號,平年二月28號,閏年二月為29號),在周欄位中表示週中的最後一天(即週六或7)

 

特殊字元(W):表示work(day) ,只能出現在日欄位中,用來描敘最接近指定日的工作日(週一到週五) ,例如:在day-of-month欄位用“15W”指“最接近這個月第15天的工作日”,即如果這個月第15天是週六,那麼觸發器將會在這個月第14天即週五觸發;如果這個月第15天是週日,那麼觸發器將會在這個月第 16天即週一觸發;如果這個月第15天是週二,那麼就在觸發器這天觸發。注意一點:這個用法只會在當前月計算值,不會越過當前月。“W”字元僅能在 day-of-month指明一天,不能是一個範圍或列表。也可以用“LW”來指定這個月的最後一個工作日,即最後一個星期五。

 

特殊字元(#): 只能出現在周欄位。用來指定這個月的第幾個周幾。例:在周欄位用"6#3" or "FRI#3"指這個月第5個週五(6指週五,3指第3個)。如果指定的日期在某月份不存在,則觸發器就不會觸發 。

 

cron表示式例項 :

從當前時間開始每5秒執行一次     */5 * * * * ? 

從0秒開始每5秒執行一次   0/5 * * * * ?

工作日(週一至週五)下班(18:00)時傳送工作郵件     0 0 18 ? * 2-6 

每年的父親節(6月的第三個星期日)的12點整給父親送去祝福     0 0 12 ? 6 7#3 

每年的母親節(5月的第二個星期日)的12點整給母親送去祝福     0 0 12 ? 5 7#2