java quartz 中的時間格式

實例:java

<!--
  配置說明  
  字段           容許值             容許的特殊字符(*表示全部值  ?表示未說明的值,即不關心它爲什麼值  -表示一個指定的範圍  ,表示附加一個可能值  /符號前表示開始時間,符號後表示每次遞增的值)
  秒             0-59             , - * /   
  分             0-59             , - * /   
  小時           0-23             , - * /   
  日期           1-31             , - * ? / L W C   
  月份    1-12 或者 JAN-DEC       , - * /   
  星期    1-7 或者 SUN-SAT        , - * ? / L C #   
  年(可選)留空, 1970-2099       , - * /   
  
 *************************************************************************************
 
  表達式意義,舉例   
  "0 0 12 * * ?"    天天中午12點觸發   
  "0 15 10 ? * *"    天天上午10:15觸發   
  "0 15 10 * * ?"    天天上午10:15觸發   
  "0 15 10 * * ? *"    天天上午10:15觸發   
  "0 15 10 * * ? 2005"    2005年的天天上午10:15觸發   
  "0 * 14 * * ?"    在天天下午2點到下午2:59期間的每1分鐘觸發   
  "0 0/5 14 * * ?"    在天天下午2點到下午2:55期間的每5分鐘觸發    
  "0 0/5 14,18 * * ?"    在天天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發    
  "0 0-5 14 * * ?"    在天天下午2點到下午2:05期間的每1分鐘觸發   
  "0 10,44 14 ? 3 WED"    每一年三月的星期三的下午2:10和2:44觸發   
  "0 15 10 ? * MON-FRI"    週一至週五的上午10:15觸發   
  "0 15 10 15 * ?"    每個月15日上午10:15觸發   
  "0 15 10 L * ?"    每個月最後一日的上午10:15觸發   
  "0 15 10 ? * 6L"    每個月的最後一個星期五上午10:15觸發     
  "0 15 10 ? * 6L 2002-2005"    2002年至2005年的每個月的最後一個星期五上午10:15觸發   
  "0 15 10 ? * 6#3"    每個月的第三個星期五上午10:15觸發    
  -->併發

 

SimpleTrigger
若是須要計劃一個任務在指定的時間執行,或者在指定的時間後以指定的間隔連續執行屢次,好比但願在2005年1月12號上午11:22:54開始執行一個任務,在這以後每隔20分鐘執行一次,共執行一次,這種狀況下可使用SimpleTrigger。函數

SimpleTrigger包含幾個屬性:開始時間,結束時間,重複次數和間隔。字符串

重複次數能夠是大於等於0,或者是常量值SimpleTrigger.REPEAT_INDEFINITELY,間隔必須大於等於0的長整數,單位是微秒。若是間隔爲0表示併發執行重複次數。部署

若是不熟悉java.util.Calendar類,可能常常須要根據開始時間計算觸發時間,org.quartz.helpers.TriggerUtils 能夠幫助完成這些任務。get

結束時間屬性重寫重複次數屬性。若是但願建立一個觸發器,每隔10秒執行一次,直到一個指定的時間,能夠簡單的指定結束時間, 重複次數值爲REPEAT_INDEFINITELY。配置

SimpleTrigger有幾個構造函數,下面是其中一個:構造函數

java 代碼
public SimpleTrigger(String name,   
                       String group,   
                       Date startTime,   
                       Date endTime,   
                       int repeatCount,   
                       long repeatInterval)   
建立一個10秒鐘後只執行一次的觸發器:語法

java 代碼
long startTime = System.currentTimeMillis() + 10000L;   
  
SimpleTrigger trigger = new SimpleTrigger("myTrigger",   
                                            null,   
                                            new Date(startTime),   
                                            null,   
                                            0,   
                                            0L);   
建立一個每隔60秒重複執行的觸發器:引用

SimpleTrigger trigger = new SimpleTrigger("myTrigger",   
                                            null,   
                                            new Date(),   
                                            null,   
                                            SimpleTrigger.REPEAT_INDEFINITELY,   
                                            60L * 1000L);  
java 代碼
建立一個40秒後開始執行,每隔10秒執行一次的觸發器:

java 代碼
long endTime = System.currentTimeMillis() + 40000L;   
  
SimpleTrigger trigger = new SimpleTrigger("myTrigger",   
                                            "myGroup",   
                                            new Date(),   
                                            new Date(endTime),   
                                            SimpleTrigger.REPEAT_INDEFINITELY,   
                                            10L * 1000L);   
建立一個觸發器,在2002年3月17日開始執行,重複5次,每次間隔爲30秒:

java 代碼
 

java.util.Calendar cal = new java.util.GregorianCalendar(2002, cal.MARCH, 17);   
  cal.set(cal.HOUR, 10);   
  cal.set(cal.MINUTE, 30);   
  cal.set(cal.SECOND, 0);   
  cal.set(cal.MILLISECOND, 0);  Data startTime = cal.getTime()  SimpleTrigger trigger = new SimpleTrigger("myTrigger",   
                                            null,   
                                            startTime,   
                                            null,   
                                            5,   
                                            30L * 1000L);  
CronTrigger

若是須要基於日曆指定觸發器,可使用CronTrigger。使用CronTrigger能夠實現相似的觸發器,好比:每一個星期五的下午。好比每一個星期一,三和五的上午9點到10點之間每隔5分鐘。

CronTrigger也有一個開始時間和結束時間屬性,用來指定何時任務開始和結束。

Cron表達式
*Cron*表達式用來配置CronTrigger。Cron表達式是一個由七個部分組成的字符串,這七個部分用空隔進行分隔:

Seconds
Minutes
Hours
Day-of-Month
Month
Day-of-Week
Year (可選字段)
'*'字符表示指定字段的全部可能值,好比Day-Of-Week字段的*表示天天。

每一個字段都有一些有效值。好比秒和分能夠取值0-59,小時能夠取值0-23。Day-of-Month能夠取值0-31,須要注意一個月有多少天。 月能夠取值0-11,或者經過使用JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 和 DEC。 Days-of-Week能夠取值1-7(1==Sunday)或者SUN, MON, TUE, WED, THU, FRI 和SAT。

'/' 字符能夠用來指定增量,好比若是指定Minute字段爲"0/15"表示在第0分鐘啓動,每隔15分鐘的間隔;"3/20"表示每三分鐘啓動,每隔20分鐘的間隔。

'?' 字符能夠在day-of-month和day-of-week 字段中使用,用來表示沒有指定值。

'L'字符能夠在day-of-month和day-of-week 字段中使用,這個字符表示最後一個的意思。好比在day-of-month字段中表示這個月的最後一天,若是在day-of-week字段表示"7"或者"SAT",可是若是在day-of-week字段L在另外一個值後面,意味着這個月的最後XXX天,好比"6L"表示這個月的最後一個星期五。使用這個字符,不能指定列表,範圍值。

'W'字符用來指定離指定天最近的星期XXX,好比若是day-of-month字段值爲"15W",表示離這個月15號最近的一個weekday。

'#'字符用來表示這個月的第幾個XXX,好比day-of-week字段的"6#3"表示這個月的第三個星期五。

下面是一些示例:
建立一個每五分鐘激活一次的觸發器:

java 代碼
"0 0/5 * * * ?"   
建立一個觸發器在當前分鐘的第10秒後,每五分鐘執行一次,好比上午10:00:10 am,上午10:05:10:

java 代碼
"10 0/5 * * * ?"   
建立一個觸發器,在每一個星期三和星期五的10:30, 11:30, 12:30, 和13:30執行。

java 代碼
"0 30 10-13 ? * WED,FRI"   
建立一個觸發器,在每月的第5天和第20天的上午8點到10點執行,每隔半小時執行一次,注意上午10:00不會執行:

java 代碼
"0 0/30 8-9 5,20 * ?"  

------------------------------------------------------------------

 

上一文中提到 Cron觸發器能夠接受一個表達式來指定執行JOB,下面看看這個表達式的語法。 cron 表達式的格式 Quartz cron 表達式的格式十分相似於 UNIX cron 格式,但仍是有少量明顯的區別。區別之一就是 Quartz 的格式向下支持到秒級別的計劃,而 UNIX cron 計劃僅支持至分鐘級。許多咱們的觸發計劃要基於秒級遞增的(例如,每45秒),所以這是一個很是好的差別。 在 UNIX cron 裏,要執行的做業(或者說命令)是存放在 cron 表達式中的,在第六個域位置上。Quartz 用 cron 表達式存放執行計劃。引用了 cron 表達式的 CronTrigger 在計劃的時間裏會與 job 關聯上。 另外一個與 UNIX cron 表達式的不一樣點是在表達式中支持域的數目。UNIX 給出五個域(分、時、日、月和周),Quartz 提供七個域。表 5.1 列出了 Quartz cron 表達式支持的七個域。 表 5.1. Quartz Cron 表達式支持到七個域  名稱 是否必須 容許值 特殊字符 秒 是 0-59 , - * / 分 是 0-59 , - * / 時 是 0-23 , - * / 日 是 1-31 , - * ? / L W C 月 是 1-12 或 JAN-DEC , - * / 周 是 1-7 或 SUN-SAT , - * ? / L C # 年 否 空 或 1970-2099 , - * / 月份和星期的名稱是不區分大小寫的。FRI 和 fri 是同樣的。 域之間有空格分隔,這和 UNIX cron 同樣。無可爭辯的,咱們能寫的最簡單的表達式看起來就是這個了: * * * ? * * 這個表達會每秒鐘(每分種的、每小時的、天天的)激發一個部署的 job。 &middot;理解特殊字符 同 UNIX cron 同樣,Quartz cron 表達式支持用特殊字符來建立更爲複雜的執行計劃。然而,Quartz 在特殊字符的支持上比標準 UNIX cron 表達式更豐富了。 * 星號 使用星號(*) 指示着你想在這個域上包含全部合法的值。例如,在月份域上使用星號意味着每月都會觸發這個 trigger。 表達式樣例: 0 * 17 * * ? 意義:天天從下午5點到下午5:59中的每分鐘激發一次 trigger。它停在下午 5:59 是由於值 17 在小時域上,在下午 6 點時,小時變爲 18 了,也就再也不理會這個 trigger,直到下一天的下午5點。 在你但願 trigger 在該域的全部有效值上被激發時使用 * 字符。 ? 問號 ? 號只能用在日和周域上,可是不能在這兩個域上同時使用。你能夠認爲 ? 字符是 "我並不關心在該域上是什麼值。" 這不一樣於星號,星號是指示着該域上的每個值。? 是說不爲該域指定值。 不能同時這兩個域上指定值的理由是難以解釋甚至是難以理解的。基本上,假定同時指定值的話,意義就會變得含混不清了:考慮一下,若是一個表達式在日域上有值11,同時在周域上指定了 WED。那麼是要 trigger 僅在每月的11號,且正好又是星期三那天被激發?仍是在每一個星期三的11號被激發呢?要去除這種不明確性的辦法就是不能同時在這兩個域上指定值。 只要記住,假如你爲這兩域的其中一個指定了值,那就必須在另外一個字值上放一個 ?。 表達式樣例: 0 10,44 14 ? 3 WEB 意義:在三月中的每一個星期三的下午 2:10 和 下午 2:44 被觸發。 , 逗號 逗號 (,) 是用來在給某個域上指定一個值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒觸發一個 trigger。 表達式樣例: 0 0,15,30,45 * * * ? 意義:每刻鐘觸發一次 trigger。 / 斜槓 斜槓 (/) 是用於時間表的遞增的。咱們剛剛用了逗號來表示每15分鐘的遞增,可是咱們也能寫成這樣 0/15。 表達式樣例: 0/15 0/30 * * * ? 意義:在整點和半點時每15秒觸發 trigger。 - 中劃線 中劃線 (-) 用於指定一個範圍。例如,在小時域上的 3-8 意味着 "3,4,5,6,7 和 8 點。"  域的值不容許回捲,因此像 50-10 這樣的值是不容許的。 表達式樣例: 0 45 3-8 ? * * 意義:在上午的3點至上午的8點的45分時觸發 trigger。 L 字母 L 說明了某域上容許的最後一個值。它僅被日和周域支持。當用在日域上,表示的是在月域上指定的月份的最後一天。例如,當月域上指定了 JAN 時,在日域上的 L 會促使 trigger 在1月31號被觸發。假如月域上是 SEP,那麼 L 會預示着在9月30號觸發。換句話說,就是無論指定了哪一個月,都是在相應月份的時最後一天觸發 trigger。 表達式 0 0 8 L * ? 意義是在每月最後一天的上午 8:00 觸發 trigger。在月域上的 * 說明是 "每月"。 當 L 字母用於周域上,指示着周的最後一天,就是星期六 (或者數字7)。因此若是你須要在每月的最後一個星期六下午的 11:59 觸發 trigger,你能夠用這樣的表達式 0 59 23 ? * L。 當使用於周域上,你能夠用一個數字與 L 連起來表示月份的最後一個星期 X。例如,表達式 0 0 12 ? * 2L 說的是在每月的最後一個星期一觸發 trigger。 不要讓範圍和列表值與 L 連用 雖然你能用星期數(1-7)與 L 連用,可是不容許你用一個範圍值和列表值與 L 連用。這會產生不可預知的結果。 W 字母 W 字符表明着平日 (Mon-Fri),而且僅能用於日域中。它用來指定離指定日的最近的一個平日。大部分的商業處理都是基於工做周的,因此 W 字符多是很是重要的。例如,日域中的 15W 意味着 "離該月15號的最近一個平日。" 假如15號是星期六,那麼 trigger 會在14號(星期四)觸發,由於距15號最近的是星期一,這個例子中也會是17號(譯者Unmi注:不會在17號觸發的,若是是15W,可能會是在14號(15號是星期六)或者15號(15號是星期天)觸發,也就是隻能出如今鄰近的一天,若是15號當天爲平日直接就會當日執行)。W 只能用在指定的日域爲單天,不能是範圍或列表值。 # 井號 # 字符僅能用於周域中。它用於指定月份中的第幾周的哪一天。例如,若是你指定周域的值爲 6#3,它意思是某月的第三個週五 (6=星期五,#3意味着月份中的第三週)。另外一個例子 2#1 意思是某月的第一個星期一 (2=星期一,#1意味着月份中的第一週)。注意,假如你指定 #5,然而月份中沒有第 5 周,那麼該月不會觸發。 Cron 表達式 Cookbook 此處的 Cron 表達式 cookbook 旨在爲經常使用的執行需求提供方案。儘管不可能列舉出全部的表達式,但下面的應該爲知足你的業務需求提供了足夠的例子。 &middot;分鐘的 Cron 表達式 表 5.1. 包括了分鐘頻度的任務計劃 Cron 表達式 用法 表達式 天天的從 5:00 PM 至 5:59 PM 中的每分鐘觸發 0 * 17 * * ? 天天的從 11:00 PM 至 11:55 PM 中的每五分鐘觸發 0 0/5 23 * * ? 天天的從 3:00 至 3:55 PM 和 6:00 PM 至 6:55 PM 之中的每五分鐘觸發 0 0/5 15,18 * * ? 天天的從 5:00 AM 至 5:05 AM 中的每分鐘觸發 0 0-5 5 * * ? &middot;日上的 Cron 表達式 表 5.2. 基於日的頻度上任務計劃的 Cron 表達式 用法 表達式 天天的 3:00 AM  0 0 3 * * ? 天天的 3:00 AM (另外一種寫法)  0 0 3 ? * * 天天的 12:00 PM (中午) 0 0 12 * * ? 在 2005 中天天的 10:15 AM 0 15 10 * * ? 2005 &middot;周和月的 Cron 表達式 表 5.3. 基於周和/或月的頻度上任務計劃的 Cron 表達式 用法 表達式 在每一個週一,二, 三和週四的 10:15 AM 0 15 10 ? * MON-FRI 每個月15號的 10:15 AM   0 15 10 15 * ? 每個月最後一天的 10:15 AM 0 15 10 L * ? 每個月最後一個週五的 10:15 AM  0 15 10 ? * 6L 在 2002, 2003, 2004, 和 2005 年中的每個月最後一個週五的 10:15 AM  0 15 10 ? * 6L 2002-2005 每個月第三個週五的 10:15 AM 0 15 10 ? * 6#3 每個月從第一天算起每五天的 12:00 PM (中午) 0 0 12 1/5 * ? 每個 11 月 11 號的 11:11 AM 0 11 11 11 11 ? 三月份每一個週三的 2:10 PM 和 2:44 PM 0 10,44 14 ? 3 WED

相關文章
相關標籤/搜索