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