定时器 cron 表达式
簡單的來說,cron?表達式可以看作是一個有5~7個以空格隔開的的單個字符組成的一組字符串,這5~7個字符就表示了5~7個域,每個域從左到右依次為?秒?分?時?日?月?星期?年?。?cron?表達式在不同的語言中可用的域是不同,下面分別從spring和linux兩個維度進行分析。
Spring 定時器 cron 表達式
Cron有如下兩種語法?
格式:?
Seconds Minutes Hours DayofMonth Month DayofWeek Year 或?
Seconds Minutes Hours DayofMonth Month DayofWeek?
每一個域可出現的字符如下:
代碼
Seconds:可出現,- ?* ?/ 四個字符,有效范圍為0-59的整數 ? ?
Minutes:可出現,- ?* ?/ 四個字符,有效范圍為0-59的整數 ? ?
Hours:可出現,- ?* ?/ 四個字符,有效范圍為0-23的整數 ? ?
DayofMonth:可出現,- ?* ?/ ? L W C八個字符,有效范圍為0-31的整數 ? ??
Month:可出現,- ?* ?/ 四個字符,有效范圍為1-12的整數或JAN-DEc ? ?
DayofWeek:可出現,- ?* ?/ ? L C #四個字符,有效范圍為1-7的整數或SUN-SAT兩個范圍。1表示星期天,2表示星期一, 依次類推 ? ?
Year:可出現,- ?* ?/ 四個字符,有效范圍為1970-2099年 ??
?
每一個域都使用數字,但還可以出現如下特殊字符,它們的含義是:
(1)*:表示匹配該域的任意值,假如在Minutes域使用*,即表示每分鐘都會觸發事件。 ? ?
? ?
(2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和DayofWeek會相互影響。
例如想在每月的20日觸發調度,不管20日到底是星期幾,則只能使用如下寫法: 13 ?13 15 20 * ?,其中最后一位只能用?,而不能使用*,
如果使用*表示不管星期幾都會觸發,實際上并不是這樣。 ? ?
? ?
(3)-:表示范圍,例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次 ? ?
?
(4)/:表示起始時間開始觸發,然后每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味著5分鐘觸發一次,而25,45等分別觸發一次. ? ?
? ?
(5),:表示列出枚舉值值。例如:在Minutes域使用5,20,則意味著在5和20分每分鐘觸發一次。 ? ?
? ?
(6)L:表示最后,只能出現在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味著在最后的一個星期四觸發。 ? ?
? ?
(7)W:表示有效工作日(周一到周五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。
例如:在DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日觸發;
如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份 ? ?
(8)LW:這兩個字符可以連用,表示在某個月最后一個工作日,即最后一個星期五。 ? ?
(9)#:用于確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三。 ??
?
舉幾個例子:
0 0 ?2 ?1 * ?? * ?表示在每月的1日的凌晨2點調度任務 ? ??
0 15 10 ? * ?MON-FRI 表示周一到周五每天上午10:15執行作業 ? ? ? ? ? ??
0 15 10 ? 6L 2002-2006 表示200-2006年的每個月的最后一個星期五上午10:15執行作業 ??
linux 定時器 cron 表達式
在crontab?中的cron?表達式有5個域,從左到右依次為分?時?日?月?星期
完整格式說明如下:
| 分 | 一小時中的哪一分鐘 | 是 | 0~59 | ,?-?*?/ |
| 時 | 一天中的什么時間 | 是 | 0~23 | ,?-?*?/ |
| 日 | 一月中的哪一天 | 是 | 1~31 | ??-?*?/?L?W |
| 月 | 一年中的哪一月 | 是 | 1~12/JAN-DEC | ,?-?*?/ |
| 星期 | 一周中的哪一天 | 是 | 1~7/SUN-SAT | ,?-?*?/???L?# |
關于通配符的說明:
| , | 匹配一個枚舉值的集合 | 表示列出一個枚舉值集合,滿足枚舉值條件的值都會觸發。例如在分域中使用1,2?,則意味著在1和2分鐘的時候分別觸發一次。 |
| - | 匹配一個范圍 | 表示一個范圍值,滿足在范圍內的值都會觸發。例如在時域中時用0-10,則意味著在0點到10點每個小時都會觸發一次。 |
| * | 匹配任意值 | 表示匹配域中的任意值。例如在分域中使用*,則意味著任何每一分鐘都滿足觸發條件。 |
| / | 匹配指定的間隔 | 表示從起始時間開始,每隔指定間隔時間觸發。例如在日域中使用1/3,則意味著,從每月1號開始,每隔3天觸發一次,也可以使用*/3,則意味著每隔3天就會觸發一次。 |
| ? | 忽略該域 | 個人理解為忽略該域。因為在日域和星期域如果同時存在值的話,就會導致兩個域沖突,而達不到想要的觸發效果。例如在日域指定值為2表示在每個月的2號觸發,這個時候星期域就必須使用?通配符,因為如果在星期域再指定一個明確的值的如3的話,就會導致如果2號不是指定星期的第三天,那么就不會觸發,從而就達不到每月2號執行的預期。 |
| L | last,匹配最后一天 | 表示匹配一月或者一個星期的最后一天。例如在月域中使用L,則意味著在每月的最后一天觸發。 |
| W | work,匹配最近的一個工作日 | 表示匹配指定離指定日期最近的一個工作日。例如在日域中使用5W,則意味著在距離5號,最近的一個工作日觸發。 |
| # | 匹配第幾個星期幾 | 表示匹配在第幾個星期幾執行。該通配符只能在星期域中使用。例如使用5#2,則意味著在每月的第2個星期5觸發。 |
舉例:
| ?實例 | |
| ?每1分鐘執行一次 | ?*?*?*?*?*?command/1 * * * * command |
| ?每小時的第15,30,45分鐘執行 | ?15,30,45 *?*?*?*?command |
| ?7點到10點的第10,50分鐘執行 | ?10,20 7-50 *?*?*?command |
| ?每隔一天的7點到11點的第20和第40分鐘執行 | ?20,40 7-11?*/1?*?*?command |
| ?每周一的7點到11點的第25和第50分鐘執行 | 25,50 7-11?*?*?1?command |
| ?每天的3:30執行 | ?30?3?*?*?*?command |
| ?每月1、10、20日的3?:?30執行 | ?30 3?1,10,20?*?* command |
| ?每周六、周日的3?:?30執行 | ?30?3?*?*?6,0?command30?3?*?*?6,7?command |
| ?每天9點到16點之間每隔15分鐘執行 | ?/15 9-16 * * * command |
總結
以上是生活随笔為你收集整理的定时器 cron 表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间表达式java定时器_java--定
- 下一篇: 定时器 Corn时间表达式