Spring定時任務(二):cron表達式詳解


一、 語法

  Cron表達式是一個字符串,從Spring4.x版本后,不再進行年份的支持。該字符串以5個空格隔開,分為6個域,每一個域代表一個含義。語法如下:

  seconds   minutes  hours  daysOfMonth  months  daysOfWeek

  有興趣的同學可以參考Cron表達式解析類:org.springframework.scheduling.support.CronSequenceGenerator

 

二、pattern每隔域說明  

字段名              含義          允許的值                        允許的特殊字符  
seconds            秒                    0-59                            , - * /  
minutes        分                    0-59                            , - * /  
hours              小時                  0-23                            , - * /  
daysOfMonth        日                    1-31                            , - * ? / L W C  
months         月                    1-12 or JAN-DEC                 , - * /  
daysOfWeek         周幾                  1-7 or SUN-SAT                  , - * ? / L C #

 

 

三、特殊字符說明 

  * :   可用在所有字段中,表示對應時間域的每一個時刻,例如,*在分鍾字段時,表示“每分鍾”;

  ?:  只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和 DayofWeek會相互影響。例如想在每月的20日觸發調度,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣

  -:   表達一個范圍,如在小時字段中使用“10-12”,則表示從10到12點,即10,11,12;

  ,:   表達一個列表值,如在星期字段中使用“MON,WED,FRI”,則表示星期一,星期三和星期五;

  /: x/y表達一個等步長序列,x為起始值,y為增量步長值。如在分鍾字段中使用0/15,則表示為0,15,30和45秒,而5/15在分鍾字段中表示5,20,35,50,你也可以使用*/y,它等同於0/y;

  L:   該字符只在日期和星期字段中使用,代表“Last”的意思,但它在兩個字段中意思不同。L在日期字段中,表示這個月份的最后一天,如一月的31號,非閏年二月的28號;如果L用在星期中,則表示星期六,等同於7。但是,如果L出現在星期字段里,而且在前面有一個數值 X,則表示“這個月的最后X天”,例如,6L表示該月的最后星期五;

  W:     該字符只能出現在日期字段里,是對前導日期的修飾,表示離該日期最近的工作日。例如15W表示離該月15號最近的工作日,如果該月15號是星期六,則匹配14號星期五;如果15日是星期日,則匹配16號星期一;如果15號是星期二,那結果就是15號星期二。但必須注意關聯的匹配日期不能夠跨月,如你指定1W,如果1號是星期六,結果匹配的是3號星期一,而非上個月最后的那天。W字符串只能指定單一日期,而不能指定日期范圍;

  LW組合:在日期字段可以組合使用LW,它的意思是當月的最后一個工作日;

  #:該字符只能在星期字段中使用,表示當月某個工作日。如6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個),而4#5表示當月的第五個星期三,假設當月沒有第五個星期三,忽略不觸發;

  C:該字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是計划所關聯的日期,如果日期沒有被關聯,則相當於日歷中所有日期。例如5C在日期字段中就相當於日歷5日以后的第一天。1C在星期字段中相當於星期日后的第一天。

 

四、使用案例

  0 0 10,14,16 * * ? 每天上午10點,下午2點,4點 
  0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時 
  0 0 12 ? * WED 表示每個星期三中午12點 
  "0 0 12 * * ?" 每天中午12點觸發 
  "0 15 10 ? * *" 每天上午10:15觸發 
  "0 15 10 * * ?" 每天上午10:15觸發 
  "0 15 10 * * ? *" 每天上午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 ? * 6#3" 每月的第三個星期五上午10:15觸發


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM