跳轉至

Cron 表達式

  • 支援標準 Cron 格式,包含秒數。
  • 支援非標準字符如 LW# 及其組合。
  • 支援倒置範圍,如 23-01(相當於 23,00,01)或 DEC-FEB(相當於 DEC,JAN,FEB)。
  • 支援時區,並為您執行所有的日期/時間轉換。
  • 當時鐘快進到夏令時(又稱夏季時間)時,不會跳過發生的次數。
  • 當時鐘從夏季時間回退時,不會跳過基於間隔的發生。
  • 當時鐘從夏季時間回退時,不會重試非基於間隔的發生。

Cron 格式

Cron 表達式是一種用於定義固定時間、日期並設定間隔的掩碼。這個掩碼由秒(可選)、分鐘、小時、日期、月份和星期幾組成。所有欄位允許您指定多個值,任何給定的日期/時間如果所有欄位包含匹配值將滿足指定的 Cron 表達式。

Text Only
                                    允許的值            允許的特殊字符              註釋

┌───────────── 秒(可選)             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-DecMon-Sun)來替代它們的數字值。不支援完整的名字如 JANUARYMONDAY

在星期欄位中,07均代表星期日,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 代表“最後”. 當用在星期欄位中時,允許指定如 最後一個星期五 (5LFRIL)。在日期欄位中,則指出月的最後一天。

W 在日期欄位中是最接近的工作日。用 W 與單個值(不包括範圍、步長或 *)來定義 最接近的工作日。在這種情況下,有兩個基本規則來確定發生時間:我們必須轉移到最接近的工作日並且不能轉移到不同月份。因此,如果給定日期是星期六,我們轉移到星期五,如果是星期日,我們轉移到星期一。然而,如果給定日期是 每月的第一天(例如,0 0 1W * *)而它是星期六,我們轉移到下週一,如果給定日期是 月底0 0 31W 0 0)而它是星期日我們則轉移至上週五。可混合使用 L(可選擇性地帶偏移量)和 W 字符來指定 月底工作日 LW 或更複雜內容如 L-5W

# 在星期欄位允許指定如 第二個星期六 (6#2SAT#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分鐘它應該發生。

Text Only
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 – 執行