Cron 表達式¶
- 支援標準 Cron 格式,包含秒數。
- 支援非標準字符如
L
、W
、#
及其組合。 - 支援倒置範圍,如
23-01
(相當於23,00,01
)或DEC-FEB
(相當於DEC,JAN,FEB
)。 - 支援時區,並為您執行所有的日期/時間轉換。
- 當時鐘快進到夏令時(又稱夏季時間)時,不會跳過發生的次數。
- 當時鐘從夏季時間回退時,不會跳過基於間隔的發生。
- 當時鐘從夏季時間回退時,不會重試非基於間隔的發生。
Cron 格式¶
Cron 表達式是一種用於定義固定時間、日期並設定間隔的掩碼。這個掩碼由秒(可選)、分鐘、小時、日期、月份和星期幾組成。所有欄位允許您指定多個值,任何給定的日期/時間如果所有欄位包含匹配值將滿足指定的 Cron 表達式。
允許的值 允許的特殊字符 註釋
┌───────────── 秒(可選) 0-59 * , - /
│ ┌───────────── 分鐘 0-59 * , - /
│ │ ┌───────────── 小時 0-23 * , - /
│ │ │ ┌───────────── 日期 1-31 * , - / L W ?
│ │ │ │ ┌───────────── 月份 1-12 or JAN-DEC * , - /
│ │ │ │ │ ┌───────────── 星期几 0-6 or SUN-SAT * , - / # L ? 0 和 7 均表示星期日
│ │ │ │ │ │
* * * * * *
基本字符¶
在所有欄位中,您可以使用數字,*
來標記欄位為 任何值,-
來指定數值範圍。支持倒置範圍如 22-1
(相當於 22,23,0,1,2
)。
可以通過將 /
與 *
、數字和範圍組合來定義步長。例如,*/5
在分鐘欄位中描述了 每 5 分鐘 和 1-15/3
在日期欄位中代表 – 從 1 號到 15 號的每 3 天。注意 */24
只是等價於 0,24,48
並且 */24
在分鐘欄位中不代表 每 24 分鐘 它代表 每 0,24,48 分鐘。
通過 ,
連接值和範圍。逗號的運作如同 OR
運算符。因此 3,5-11/3,12
相當於 3,5,8,11,12
。
在月和星期欄位中,您可以用月的名字或星期幾的名字縮寫為前三個字母(Jan-Dec
或 Mon-Sun
)來替代它們的數字值。不支援完整的名字如 JANUARY
或 MONDAY
。
在星期欄位中,0
和7
均代表星期日,1代表星期一。
表達式 | 描述 |
---|---|
* * * * * | 每分鐘 |
0 0 1 * * | 每月的第 1 天凌晨 |
*/5 * * * * | 每 5 分鐘 |
30,45-15/2 1 * * * | 從凌晨 1:00 至 1:15 以及從 1:45 到 1:59 每 2 分鐘,以及凌晨 1:30 |
0 0 * * MON-FRI | 每週一至週五的 00:00 |
特殊字符¶
大多數的表達式您可以用基本字符來描述。如果您想處理更為複雜的情況如 月底 或 第二個星期六 使用特殊字符:
L
代表“最後”. 當用在星期欄位中時,允許指定如 最後一個星期五 (5L
或 FRIL
)。在日期欄位中,則指出月的最後一天。
W
在日期欄位中是最接近的工作日。用 W
與單個值(不包括範圍、步長或 *
)來定義 最接近的工作日。在這種情況下,有兩個基本規則來確定發生時間:我們必須轉移到最接近的工作日並且不能轉移到不同月份。因此,如果給定日期是星期六,我們轉移到星期五,如果是星期日,我們轉移到星期一。然而,如果給定日期是 每月的第一天(例如,0 0 1W * *
)而它是星期六,我們轉移到下週一,如果給定日期是 月底(0 0 31W 0 0
)而它是星期日我們則轉移至上週五。可混合使用 L
(可選擇性地帶偏移量)和 W
字符來指定 月底工作日 LW
或更複雜內容如 L-5W
。
#
在星期欄位允許指定如 第二個星期六 (6#2
或 SAT#2
)。
?
是 *
的同義詞。它被支持但不是強制的,因此 0 0 5 * ?
與 0 0 5 * *
相同。
表達式 | 描述 |
---|---|
0 0 L * * | 每月最後一天的凌晨 00:00 |
0 0 L-1 * * | 每月最後一天的前一天的凌晨 00:00 |
0 0 3W * * | 每月第三個工作日的凌晨 00:00 |
0 0 LW * * | 每月最後一個工作日的凌晨 00:00 |
0 0 * * 2L | 每月最後一個星期二的凌晨 00:00 |
0 0 * * 6#3 | 每月第三個星期六的凌晨 00:00 |
0 0 ? 1 MON#1 | 在一月的第一個星期一的凌晨 00:00 |
指定日期和星期幾¶
您可以設定日期和星期幾,可用來指定如星期五和13號的結構。因此 0 0 13 * 5
表示在凌晨 00:00,星期五和13號。
這和 Unix Crontab 及 Quartz cron 的實作不同。Crontab 將這種情況處理為 OR
運算符:發生的次數可以是給定的獨立日或星期。因此 0 0 13 * 5
意思是每個月的 13 號或者每個星期五凌晨 00:00。Quartz 不允許指定日期和星期幾。
宏¶
宏是一個以 @
開頭的字串,代表一些簡單情況的快捷方式,如每日或每分鐘。
宏 | 等價 | 註釋 |
---|---|---|
@every_second | * * * * * * | 每秒一次執行 |
@every_minute | * * * * * | 每分鐘在整分鐘時刻執行 |
@hourly | 0 * * * * | 每小時在整小時執行 |
@daily | 0 0 * * * | 每日凌晨執行一次 |
@midnight | 0 0 * * * | 每日凌晨執行一次 |
@weekly | 0 0 * * 0 | 每週日凌晨執行一次 |
@monthly | 0 0 1 * * | 每月1號的凌晨執行 |
@yearly | 0 0 1 1 * | 每年1月1日凌晨執行 |
@annually | 0 0 1 1 * | 每年1月1日凌晨執行 |
間隔表達式¶
Cron表達式是基於時間間隔的,其秒、分鐘或小時欄位包含了*
、範圍或者步長,例如30 * * * *
(小時欄位),* 1 * * *
(分鐘欄位),0,5 0/10 1 * * *
。在這種情況下,期望發生次數在一天中發生,且這個規則不能被計入時間轉換。因此對於基於時間間隔的表達式,發生會發生在時鐘的調整前后。
考慮 */30 * * * *
間隔表達式。每隔30分鐘它應該發生。
11月08日,00:30 +04:00 – 執行
11月08日,01:00 +04:00 – 執行
11月08日,01:30 +04:00 – 執行
11月08日,01:00 +03:00 – 執行
11月08日,01:30 +03:00 – 執行
11月08日,02:00 +03:00 – 執行
非間隔表達式¶
Cron表達式是非間隔的,其秒、分鐘或小時欄位不包含*
、範圍或步長,例如 0 30 1 * * *
或 0 0,45 1,2 * * *
。我們期望他們每天天次定期地發生。因此,對於非間隔的表達式,發生次數僅在時鐘轉移之前。
考慮 30 1 * * *
非間隔表達式。它應該每天一次的發生,不管怎樣。
``` 11月07日,01:30 +04:00 – 執行 11月08日,01:30 +04:00 – 執行 11月08日,01:30 +03:00 – 跳過 11月09日,01:30 +03:00 – 執行