Java 定時任務調度(1)--cron 表達式介紹


使用 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 觸發


免責聲明!

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



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