平時經常有一些寫Spring定時器的需求,但是每次要設置定時器的時間的時候,老是既不住,到處找別人的博客又各種不爽,所以就自己記錄一份吧,順便整理一下。
org.springframework.scheduling.quartz.CronTriggerBean允許你更精確地控制任務的運行時間,只需要設置其cronExpression屬性。
cronExpression規則
一個cronExpression表達式有至少6個(也可能是7個)由空格分隔的時間元素。從左至右,這些元素的定義如下:
秒 | 分鍾 | 小時 | 月份中的日期 | 月份 | 星期中的日期 | 年份 |
---|---|---|---|---|---|---|
0-59 | 0-59 | 0-23 | 1-31 | 1-12或JAN-DEC | 1-7或SUN-SAT | 1970-2099(可以沒有) |
幾個示例
表達式 | 釋義 |
---|---|
0 0 10,14,16 * * ? | 每天10點、14點/16點執行 |
0 0,15,30,45 * 1-10 * ? | 每月前10天每隔15分鍾 |
30 0 0 1 1 ? 2012 | 2012年1月1日0點30分執行 |
0 0 8-5 ? * MON-FRI | 每個工作日的早8點到晚5點 |
各個時段可用值如下
單位 | 可用值 |
---|---|
秒 | 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 |