cron表達式通過特定的規則指定時間,用於定時任務,本文簡單記錄它的部分語法和實例,並不完全,能覆蓋日常大部分需求。
1. 整體結構
cron表達式是一個字符串,分為6或7個域,每兩個域之間用空格分隔,其語法格式為:
"秒域 分域 時域 日域 月域 周域 年域"
其中,年域可以省略,省略時表示每年。
2. 每個域的取值范圍
域名 | 可取值 | 可取符號(僅列部分常用) |
秒域 | 0~59的整數 | * - , / |
分域 | 0~59的整數 | * - , / |
時域 | 0~23的整數 | * - , / |
日域 | 1~31的整數 | * - , / ? L |
月域 | 1~12的整數或JAN~DEC | * - , / |
周域 | 1~7的整數或SUN~SAT | * - , / ? L # |
年域 | 1970~2099的整數 | * - , / |
3. 符號的意義
(1)* 表示可以匹配該域的所有值;
例如,"0 0 13 * * ?"表示每天的13點執行一次。
(2)?在cron表達式中必須出現且只能出現1次,用在日域或周域上,表示不確定值、不限制值;
它與*的區別是,並不能匹配到該域上的所有值,例如指定了3月份每個周五,那么3月份的周五可能只有4個值;
例如,"0 0 5 6 * ?"表示每個月6日5點鍾執行而無論周幾,"0 0 5 ? * 3"表示每個周三5點鍾執行而無論是幾號。
(3)- 表示匹配該域上的一個范圍;
例如,"0 30 9-15 ? * *"表示每天的9:30-15:30每小時執行一次,"0 1-5 * ? * 1"表示每周日每個小時的1-5分鍾每分鍾執行一次。
(4), 表示枚舉值;
例如,"0 0 8,16,23 ? * 1,7"表示每個周六日的8點、16點、23點各執行一次。
(5)/ 表示起始時間和間隔時間;
例如,"0 0 3/5 * * ?"表示每天3點開始執行,每隔5個小時執行一次,即3點、8點、13點、18點、23點各執行一次,
"*/5 * * * * ?"表示每隔5秒鍾執行一次,"0 */1 * * * ?"表示每隔1分鍾執行一次。
(6)# 只能用於周域上,#后面的數字表示第幾周,如果不存在這個周的值,則不執行;
例如,"0 0 0 ? * 5#2"表示每個月第2個周四零點執行,"15 30 6 ? * 7#5"表示每個月第5個周六6:30:15執行,如果某個月不存在第5個周六,則不執行。
(7)L 只能用於日域或周域,用於日域時表示當月最后一天,用於周域如果前面不加數字表示周六,加數字表示最后一個周值;
例如,"0 0 23 L * ?"表示每月最后一天的23點執行,"0 0 23 ? * L"表示每周六的23點執行,"0 0 23 ? * 3L"表示每月最后一個周二的23點執行。
4. 一些常見的實例(省略雙引號)
意義 | 表達式 |
每隔5秒鍾執行一次 | */5 * * * * ? |
每隔1分鍾執行一次 | 0 */1 * * * ? |
每天1點執行一次 | 0 0 1 * * ? |
每天23點55分執行一次 | 0 55 23 * * ? |
每月最后一天23點執行一次 | 0 0 23 L * ? |
每周六8點執行一次 | 0 0 8 ? * L |
每月最后一個周五,每隔2小時執行一次 | 0 0 */2 ? * 6L |
每月的第三個星期五上午10:15執行一次 | 0 15 10 ? * 5#3 |
在每天下午2點到下午2:05期間的每1分鍾執行 | 0 0-5 14 * * ? |
表示周一到周五每天上午10:15執行 | 0 15 10 ? * 2-6 |
每個月的最后一個星期五上午10:15執行 | 0 15 10 ? * 6L |
每天上午10點,下午2點,4點執行一次 | 0 0 10,14,16 * * ? |
朝九晚五工作時間內每半小時執行一次 | 0 0/30 9-17 * * ? |
每個星期三中午12點執行一次 | 0 0 12 ? * 4 |
每年三月的星期三的下午2:10和2:44各執行一次 | 0 10,44 14 ? 3 4 |
每月的第三個星期五上午10:15執行一次 | 0 15 10 ? * 6#3 |
每月一日凌晨2點30執行一次 | 0 30 2 1 * ? |
每分鍾的第10秒與第20秒都會執行 | 10,20 * * * * ? |
每月的第2個星期的周5,凌晨執行 | 0 0 0 ? * 6#2 |