Cron 表達式

解釋 Linux、Spring 或 Quartz 的 cron,也可以依欄位產生,並按這台電腦的本地時間列出接下來 10 次執行。 產生 Crontab

產生 Crontab

各欄位

這條排程什麼時候跑

可選 Linux Crontab(5 位)、Spring @Scheduled(6 位,秒在最前)或 Quartz(6 位,也可以再加年)。頁面逐段解釋,並按這台電腦的時鐘列出接下來 10 次執行。不會把工作裝進系統。若要依每天幾點,或 @daily 這種寫法來產生,用 Cron 表達式產生器。時間戳用 Unix 時間戳。

怎麼用

  1. 格式選 Linux Crontab(5 位)、Spring @Scheduled(6 位)或 Quartz(6–7 位)。選單下面那一行寫著欄位順序,以及哪個數字是週日。
  2. 直接寫表達式,打開預設,或改「各欄位」裡的每一行。預設裡有每分鐘、每小時、每天零點、每週日零點、平日 9 點到 17 點,每 15 分鐘,以及每月 1 日零點。輸入框下面的按鈕會依目前格式載入這些預設,另外還有每天 02:00、週末 09:00、從第 5 分起每 15 分、每 2 小時的第 30 分,以及每年 1 月 1 日。Spring 和 Quartz 還有每月最後一天 23:00、最接近 15 日的工作日、第一個週一 10:15,以及最後一個週五 10:15。Quartz 還有 2030 年 1 月 1 日。按鈕旁邊的連結打開 Cron 表達式產生器。每一行都有:每、範圍、間隔、指定。選「指定」才列出具體值:秒和分是 0–59,時是 0–23,日是 1–31,月是 1–12,星期是 SUN–SAT。Spring 和 Quartz 還有:不指定(?)、最後一天(L)、最後一個工作日(LW)、最近的工作日(W)、第幾個星期幾(#)、最後一個星期幾(nL)。改欄位會重寫表達式。某一段無法用這些模式表示時,這一行停在「自訂」,原文保留。
  3. 「輸入時立即更新」預設開著。「解釋」只跑一次。「顯示範例」按目前格式填入平日範例:Linux */15 9-17 * * 1-5,Spring 0 */15 9-17 * * MON-FRI,Quartz 0 */15 9-17 ? * MON-FRI。
  4. 結果先寫出每一段,再列出「接下來 10 次執行」。「全部清除」清空表達式和結果,並把每個欄位設回「每」。「複製結果」複製這段文字。切換格式會補上或去掉秒;在 Linux 裡把 ? 換成 *;把星期數字改成 SUN–SAT,讓同一批星期保持不變。

哪些日期會命中

Linux 是分、時、日、月、星期。週日是 0、7 或 SUN,週一是 1。沒有 ?、L、W、#。日和星期都做了限制時,兩邊有一邊符合即可,結果裡會寫明。

Spring 在最前面加秒。週日編號和 Linux 相同。? 表示這一位不看。L 是當月最後一天。15W 是離 15 號最近的工作日,不會跨出這個月。LW 是當月最後一個工作日。MON#1 是第一個週一。6L 是最後一個週六,因為這裡的 6 是週六。

Quartz 同樣是這六位,年可以寫成 2024-2030。週日是 1 或 SUN,週一是 2,週六是 7。6L 是最後一個週五。日和星期裡應有一個是 ?,例如每天凌晨 2 點寫作 0 0 2 * * ?。如果兩邊都寫了具體值,頁面仍按「有一邊符合就執行」列出時間,並給出警告。SUN–SAT 和 JAN–DEC 不區分大小寫,三種格式裡表示同一天、同一個月。

連字號是範圍,逗號是列舉,斜線是步長。*/15 從該段的起點每隔 15。5/15 從 5 開始每隔 15 直到該段結束,所以分鐘是 5、20、35、50。時間是本地時間,不是 UTC。有秒這一位時按秒推進,否則按分鐘推進。

會用在什麼地方

  • 寫進 crontab 之前核對 0 2 * * *。
  • Spring 每天凌晨 2 點寫成 0 0 2 * * *。
  • 核對 Quartz 的 0 15 10 ? * 6L(每月最後一個週五 10:15)或 0 0 23 L * ?(每月最後一天 23:00)。

常見問題

為什麼凌晨 2 點在 Linux 是 5 段,在 Spring 是 6 段?

Linux 沒有秒,所以是 0 2 * * *。Spring 和 Quartz 把秒放在最前,同一時刻是 0 0 2 * * *;Quartz 常寫成 0 0 2 * * ?。

問號是什麼意思?

表示這一位不指定。Quartz 要求日和星期裡有一個是 ?。0 0 2 * * ? 是每天凌晨 2 點。

1 是週日嗎?

Linux 和 Spring 裡 1 是週一,週日是 0 或 7。Quartz 裡 1 是週日,2 是週一。三種格式裡 SUN 都是週日。

時鐘和 UTC 對不上。

接下來 10 次執行用的是這台電腦的本地時區。