spring 定時任務的 執行時間設置規則-----看完這篇就懂了


單純針對時間的設置規則

org.springframework.scheduling.quartz.CronTriggerBean允許你更精確地控制任務的運行時間,只需要設置其cronExpression屬性。

一個cronExpression表達式有至少6個(也可能是7個)由空格分隔的時間元素。從左至右,這些元素的定義如下:

1.秒(0–59)

2.分鍾(0–59)

3.小時(0–23)

4.月份中的日期(1–31)

5.月份(1–12或JAN–DEC)

6.星期中的日期(1–7或SUN–SAT)

7.年份(1970–2099)

0 0 10,14,16 * * ?

每天上午10點,下午2點和下午4點

0 0,15,30,45 * 1-10 * ?

每月前10天每隔15分鍾

30 0 0 1 1 ? 2012

在2012年1月1日午夜過30秒時

0 0 8-5 ? * MON-FRI

每個工作日的工作時間

各個時間可用值如下:

秒0-59 , - * /

分0-59 , - * /

小時0-23 , - * /

日1-31 , - * ? / L W C

月1-12 or JAN-DEC , - * /

周幾1-7 or SUN-SAT , - * ? / L C #

年(可選字段) empty, 1970-2099 , - * /

可用值詳細分析如下:

“*”——字符可以用於所有字段,在“分”字段中設為"*"表示"每一分鍾"的含義。

“?”——字符可以用在“日”和“周幾”字段.它用來指定'不明確的值'.這在你需要指定這兩個字段中的某一個值而不是另外一個的時候會被用到。在后面的例子中可以看到其含義。

“-”——字符被用來指定一個值的范圍,比如在“小時”字段中設為"10-12"表示"10點到12點"。

“,”——字符指定數個值。比如在“周幾”字段中設為"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday"。

“/”——字符用來指定一個值的的增加幅度.比如在“秒”字段中設置為"0/15"表示"第0, 15, 30,和45秒"。而"5/15"則表示"第5, 20, 35,和50".在'/'前加"*"字符相當於指定從0秒開始.每個字段都有一系列可以開始或結束的數值。對於“秒”和“分”字段來說,其數值范圍為0到59,對於“小時”字段來說其為0到23,對於“日”字段來說為0到31,而對於“月”字段來說為1到12。"/"字段僅僅只是幫助你在允許的數值范圍內從開始"第n"的值。

“L”——字符可用在“日”和“周幾”這兩個字段。它是"last"的縮寫,但是在這兩個字段中有不同的含義。例如,“日”字段中的"L"表示"一個月中的最后一天" ——對於一月就是31號對於二月來說就是28號(非閏年)。而在“周幾”字段中,它簡單的表示"7" or "SAT",但是如果在“周幾”字段中使用時跟在某個數字之后,它表示"該月最后一個星期×" ——比如"6L"表示"該月最后一個周五"。當使用'L'選項時,指定確定的列表或者范圍非常重要,否則你會被結果搞糊塗的。

“W”——可用於“日”字段。用來指定歷給定日期最近的工作日(周一到周五)。比如你將“日”字段設為"15W",意為: "離該月15號最近的工作日"。因此如果15號為周六,觸發器會在14號即周五調用。如果15號為周日,觸發器會在16號也就是周一觸發。如果15號為周二,那么當天就會觸發。然而如果你將“日”字段設為"1W",而一號又是周六,觸發器會於下周一也就是當月的3號觸發,因為它不會越過當月的值的范圍邊界。'W'字符只能用於“日”字段的值為單獨的一天而不是一系列值的時候。

“L”和“W”可以組合用於“日”字段表示為'LW',意為"該月最后一個工作日"。

“#”——字符可用於“周幾”字段。該字符表示“該月第幾個周×”,比如"6#3"表示該月第三個周五( 6表示周五而"#3"該月第三個)。再比如: "2#1" =表示該月第一個周一而"4#5" =該月第五個周三。注意如果你指定"#5"該月沒有第五個“周×”,該月是不會觸發的。

“C”——字符可用於“日”和“周幾”字段,它是"calendar"的縮寫。它表示為基於相關的日歷所計算出的值(如果有的話)。如果沒有關聯的日歷,那它等同於包含全部日歷。“日”字段值為"5C"表示"日歷中的第一天或者5號以后",“周幾”字段值為"1C"則表示"日歷中的第一天或者周日以后"。

對於“月份”字段和“周幾”字段來說合法的字符都不是大小寫敏感的。

一些例子:

"0 0 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分每分鍾一次觸發

"0 0/5 14 * * ?"每天從下午2點開始到2:55分結束每5分鍾一次觸發

"0 0/5 14,18 * * ?"每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鍾一次觸發

"0 0-5 14 * * ?"每天14:00至14:05每分鍾一次觸發

"0 10,44 14 ? 3 WED"三月的每周三的14:10和14: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

 

 

 

The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.

大致意思是說:

問號(?)可以用在日期或星期字段,用來指明‘沒有特定的值’,當你為這兩個字段中的一個設定值的時候就會用到它。下面的例子中說明了這一點。

可是,在后面的例子中並沒有明確說明這個問號到底起什么作用,於是我編程試驗了一下,得出以下結論:

1、如官方文檔解釋的那樣,問號(?)的作用是指明該字段‘沒有特定的值’;

2、星號(*)和其它值,比如數字,都是給該字段指明特定的值,只不過用星號(*)代表所有可能值;

3、cronExpression對日期和星期字段的處理規則是它們必須互斥,即只能且必須有一個字段有特定的值,另一個字段必須是‘沒有特定的值’;

4、問號(?)就是用來對日期和星期字段做互斥的。

基於以上結論就可以解釋下列情況:

1、當星期和日期都為*或數字時,報錯

Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.

即兩個字段不能都指明的特定的值,必須互斥。這里的*和數字是一樣的,如果都指明特定的數字,也是報一樣的錯。

2、當星期和日期都為?時,報錯

'?' can only be specfied for Day-of-Month -OR- Day-of-Week.

3. 當星期和日期有一個為數字另一個為*時,報錯:

Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.

即兩個字段不能都‘沒有特定的值’。

這個是Spring的實現,沒有什么道理,Spring就是規定這兩個字段必須這樣互斥的設置。

這與UNIX的crontab設置不一樣,crontab的規則是日期和星期中只要滿足一個就觸發,所以不存在互斥的問題。

 

 最后推薦一個  http://cron.qqe2.com/       cron定時任務翻譯工具

 


免責聲明!

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



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