Java cron表達式整理

1. 背景

在開發(fā)的過程中,其實用到cron表達式還是比較多的,尤其是需要做一些定時任務觸發(fā)時,不可避免的需要用到cron表達式。但是之前一般就是用到的時候查詢一下,然后就沒管了,現(xiàn)在閑下來也整體學習一下這部分的知識。希望各位也能養(yǎng)成整理筆記,知識的習慣。

2. cron表達式含義

1. 結構

Cron 表達式是一個字符串 (cron="0 0 2 1 * ? *")},字符串同通過5或者6個空格分隔開形成6或7個不同的域,每個域都有特定的含義。

  • seconds minutes hours dayofmonth month dayofweek year
  • seconds minutes hours dayofmonth month dayofweek

2. value填寫

字段 允許值 允許填寫的字符
秒(Seconds) 0~59整數(shù) , - * / 四個字符
分(minutes) 0~59整數(shù) , - * / 四個字符
小時(hours) 0~23整數(shù) , - * / 四個字符
日期(dayofmonth) 1~31整數(shù)(月份不同天數(shù)不同) ,- * ? / L W C 八個字符
月份(month) 1~12 , - * / 四個字符
星期(dayofweek) 1~7(1=SUN , - * ? / L C # 八個字符
年(可選,留空 1970~2099 , - * / 四個字符

3. 特殊字符含義

  • " \color{red}{*} " : 標識匹配當前域的任意值。比如:用于分鐘區(qū)域,就表示每分鐘都執(zhí)行。
  • " \color{red}{?} " : 只能用于星期數(shù)和天數(shù),標識當前域的任意值。\color{red}{但是,實際上這兩者是相互影響的。} 比如:crontab="0 0 0 15 * ?",這個表達式的含義是每個月的15號0時0分0秒執(zhí)行,并不是每個星期都執(zhí)行。再比如:crontab="0 20 8 ? * 7", 這個表達式的含義時每個月星期六的8:20執(zhí)行,并不是每個月的每天都執(zhí)行?!?? “的填寫更像是域中不指定值的一種表示,起實際效果的由填寫數(shù)值的一方決定。這里也不能填寫*。
  • " \color{red}{-} " : 表示范圍。比如: cron="0 5-20 * * * ?", 表示5分到20分鐘之間,每分鐘觸發(fā)一次。
  • " \color{red}{/} " : 起始時間開始觸發(fā),然后間隔固定時間觸發(fā)一次。比如: cron="0 5/20 * * * ?" 表示第5分鐘時觸發(fā)一次,然后每隔20分鐘觸發(fā)一次(25 45時都會觸發(fā))。
  • " \color{red}{,} " : 表示列舉出枚舉值,比如:cron="0 5,20,30 * * * ?" 表示在5分鐘 20分鐘 30分鐘時都會觸發(fā)執(zhí)行一次。
  • " \color{red}{L} " : last表示最后,用于日期和星期數(shù)填寫。如果在dayofweek中填寫,比如:cron="0 5 9 * * 5L ?",表示在每個月最后一個星期四的9:05執(zhí)行。
  • " \color{red}{W} " : 表示有效的工作日(周一到周五),只能用于dayofmonth。比如:cron="0 0 7 23W * ?",表示在每個月的離23號最近的工作日7點執(zhí)行。如果23號是周六,那就是22號執(zhí)行;如果23號是周日,那就是24號執(zhí)行;如果23號是周三,那就是23號執(zhí)行。但是,尋找有效工作日時是不能跨月份的。
  • " \color{red}{LW} " : 兩個人字符連用,表示某個月的最后一個工作日,即最后一個星期五。

3. 插曲,crontab表達式規(guī)則

crontab的語法規(guī)則格式:

代表意義 分鐘 小時 日期 月份 命令
數(shù)字范圍 0~59 0~23 1~31 1~12 0~7 需要執(zhí)行的命令

與Java的cron表達式區(qū)別:

  1. 周的數(shù)字為 0 或 7 時,都代表“星期天”的意思,Java中不能用0表示周數(shù)。
  2. crontab無秒的表示域,是從分鐘開始。
  3. crontab表達式最后一個域是需要執(zhí)行的腳本命令,Java是表示年或者以星期數(shù)結尾。

另外,還有一些輔助的字符,大概有下面這些:

特殊字符 代表意義
*(星號) 代表任何時刻都接受的意思。舉例來說,0 12 * * * command 日、月、周都是*,就代表著不論何月、何日的禮拜幾的12:00都執(zhí)行后續(xù)命令的意思。
,(逗號) 代表分隔時段的意思。舉例來說,如果要執(zhí)行的工作是3:00與6:00時,就會是:0 3,6 * * * command時間還是有五列,不過第二列是 3,6 ,代表3與6都適用
-(減號) 代表一段時間范圍內,舉例來說,8點到12點之間的每小時的20分都進行一項工作:20 8-12 * * * command仔細看到第二列變成8-12.代表 8,9,10,11,12 都適用的意思
/n(斜線) 那個n代表數(shù)字,即是每隔n單位間隔的意思,例如每五分鐘進行一次,則:*/5 * * * * command用*與/5來搭配,也可以寫成0-59/5,意思相同
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容