使用 spring 的 @Scheduled 注解或者 quartz 來實現定時任務,都用到 cron 表達式來控制任務的定時調度;本文主要介紹下 cron 表達式及它的使用例子。
1、cron 表達式簡介
cron表達式是一個字符串,字符串分為6或7個字段:
秒 分 小時 月份中的日期 月份 星期中的日期 [年份]
各字段含義:
字段 | 允許值 | 允許的特殊字符 |
秒(Seconds) | 0~59 的整數 | , - * / |
分(Minutes) | 0~59 的整數 | , - * / |
小時(Hours) | 0~23 的整數 | , - * / |
日期(DayofMonth) | 1~31 的整數(但是你需要考慮你月的天數) | , - * ? / L W C |
月份(Month) | 1~12 的整數或者 JAN-DEC | , - * / |
星期(DayofWeek) | 1~7 的整數或者 SUN-SAT(1=SUN) | , - * ? / L C # |
年(可選)(Year) | 1970~2099 | , - * / |
cron 表達式中特殊符號的含義:
* | 表示匹配該域的任意值。如在 Minutes 域使用 '*', 即表示每分鍾都會觸發事件。 |
? | 只能用在 DayofMonth 和 DayofWeek 兩個域,表示這個位置的值不確定。DayofMonth 和 DayofWeek 是兩個相互排斥的域,需把其中一個域設為 '?'。如 1 月 10 日是星期一,如果在 DayofWeek 的位置另指定星期二,就前后沖突矛盾了。 |
- | 表示范圍。如在 Minutes 域使用 '5-20',表示從 5 分到 20 分鍾每分鍾觸發一次 |
/ | 表示起始時間開始觸發,然后每隔固定時間觸發一次。例如在 Minutes 域使用 '5/20',則意味着 5 分鍾觸發一次,而 25,45 等分別觸發一次. |
, | 表示列出枚舉值。例如:在 Minutes 域使用 '5,20',則意味着在 5 和 20 分別觸發一次。 |
L | 表示最后,只能出現在 DayofWeek 和 DayofMonth 域。在 DayofMonth 域中表示一個月的最后一天,在 DayofWeek 域表示 7 或者 SAT,如果在 DayofWeek 域中前面加上數字,它表示一個月的最后一個星期幾,例如 '6L' 就表示一個月的最后一個星期五。 |
W | 只能出現在 DayofMonth 域,用於指定日期的最近工作日(周一到周五)。例如在日期域使用 '15W',表示這個月 15 號最近的工作日;所以,如果 15 號是周六,則任務會在 14 號觸發;如果 15 號是周日,則任務會在周一也就是 16 號觸發。如果在日期域填寫 1W,即使 1 號是周六,那么任務也只會在下周一,也就是 3 號觸發,'W' 指定的最近工作日是不能夠跨月的。'W' 只能配合一個單獨的數值使用,不能夠是一個數字段,例如 '1-15W' 是錯誤的。 |
LW | 'L' 和 'W' 可以在日期域中聯合使用,表示在某個月最后一個工作日,即最后一個星期五。 |
# | 用於確定每個月第幾個星期幾,只能出現在 DayofWeek 域。例如 '4#2',表示某月的第二個星期三。 |
2、cron 表達式例子
'0 0 12 * * ?' 每天中午 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 期間的每 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 * ?' 每月1 5 日上午1 0:15 觸發
'0 15 10 L * ?' 每月最后一日的上午 10:15 觸發
'0 15 10 ? * 6L' 每月的最后一個星期五上午 10:15 觸發
'0 15 10 ? * 6L 2002-2005' 2002 年至 2005 年的每月的最后一個星期五上午 10:15 觸發
'0 15 10 ? * 6#3' 每月的第三個星期五上午 10:15 觸發