Cron表達式及其使用注意事項


Cron表達式簡介

Cron表達式全程Crontab表達式,是描述Crontab定時任務執行周期的一種語法格式。而Cron表達式嚴格上來說有許多特別的版本。如:Linux的、Spring的、Quartz框架等表達式,雖說它們總體上來說一類似的,但總會有一些語法的差異在里面。而本文要介紹的是基於Quartz 的Cron表達式。

Cron表達式的語法

HelloWord入門

​ 首先,通過一個例子來引入這個話題:如果你設計了一個程序,想要在2020年的1月2號3點4分5秒對你喜歡的人發一句話。那么,使用Cron表達式改如何配置?需要注意的是,這里的符號都是英文的標點符號,而其中問號和是比較難區分的一個。中文:英文:? 配置如下所示:

5 4 3 2 1 ? 2020 。通過這個表達式就可以猜出每個位置代表的是什么意思了。細節如下圖所示:

Cron數值范圍通用配置

​ 顧名思義,數值范圍通用的配置在語法上是非常類似的,僅僅是數值的范圍不同而已,所以這里統一進行講解。首先,時分秒數值范圍那必定是:0-23時、0-59分、0-59秒,月份和年份也以此類推。而較為特殊的如:Day of month(第幾號)、Day of week(星期幾)這兩個字段,可以使用數字和英文中的單詞縮寫來表示。需要注意的是,當你使用數字用於表達星期幾的時候,0代表的是星期日 ,這其實和外國人的日歷習慣有關。所以,當要配置Day of week這個字段的時候,推薦使用英文代替

Cron的特殊字符配置

'*' :代表任意的數值都可以滿足。需要注意的是:這里的*指的是任意,如果放入seconds這個字段,則代表每一秒都符合。在業務中,我在配置一個定時任務的時候誤以為它是默認為0的意思,差點就出了生產事故。

',':逗號表示一個字段內可以有多個值,但它並不表示一個范圍。例如,“MON,WED,FRI”在Day of week域中,表示“星期一,星期三和星期五”。

'-':這個符號則是真正的表達一個范圍。其中范圍的開始和結束是從左往右讀取的,例如:在Hours字段中,“9-14”的意思就是從9點到下午14點的意思。

'?' :從上面的圖片可以看出,問號只存在於 Day of month、Day of week中,它出現所代表的意思就是本字段沒有指定值。例如:有一個程序只在乎今天是星期幾並不在乎今天是幾號,那么就可以在Day of month加入“?”這個符號。需要注意的是:Day of month、Day of week兩個字段不能同時出現“?”這個符號。同時,也不能兩個字段都沒有“?”這個符號。意思是:兩個字段是互斥的。

’L‘:L這個字符的意思是Last(最后)的意思,它同樣只存在於 Day of month、Day of week中。用於表示:每個月的最后一天,每個星期的最后一天。需要注意的是:Day of week中的L代表的是星期六,並不是星期日 。當然,Day of week可以配合數字來使用,如:6L表示本月最后一個星期天。

’W’:只能在“day of month”。指定最接近給定日期的工作日(星期一-星期五)。例如,15W,意思是:“最接近該月15日的工作日。”;所以,如果15號是星期六,觸發器在14號星期五觸發。如果15日是星期天,觸發器在16日星期一觸發。如果15號是星期二,那么它在15號星期二觸發。1W,如果這個月的第一天是星期六,不會跨到上個月,觸發器會在這個月的第三天(也就是星期一)觸發。只有指定一天(不能是范圍或列表)的時候,才能指定“W”字符。注:可以同時使用LW,用於表示本月的最后一個工作日。

‘#’:只有Day of week可以使用,具體的形式如:sun#3,表示為本月的第3個星期日。符號“#”后面的數值范圍為1-5之間。

'/':該符號所有字段都能使用,表示一個增量的過程。如在seconds這個字段配置0/15,表示每隔15s會就會滿足一次條件。

Cron表達式實戰小練習

0 15 10 ? * * 每天上午10:15執行任務
0 15 10 * * ? 每天上午10:15執行任務
0 0 12 * * ? 每天中午12:00執行任務
0 0 10,14,16 * * ? 每天上午10:00點、下午14:00以及下午16:00執行任務
0 0/30 9-17 * * ? 每天上午09:00到下午17:00時間段內每隔半小時執行任務
0 * 14 * * ? 每天下午14:00到下午14:59時間段內每隔1分鍾執行任務
0 0-5 14 * * ? 每天下午14:00到下午14:05時間段內每隔1分鍾執行任務
0 0/5 14 * * ? 每天下午14:00到下午14:55時間段內每隔5分鍾執行任務
0 0/5 14,18 * * ? 每天下午14:00到下午14:55、下午18:00到下午18:55時間段內每隔5分鍾執行任務
0 0 12 ? * WED 每個星期三中午12:00執行任務
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執行任務
0 10,44 14 ? 3 WED 每年3月的每個星期三下午14:10到14:44時間段內執行任務


免責聲明!

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



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