Cron表示式解析器與下次執行時間計算

解析cron表示式(分 時 日 月 星期),用通俗語言展示排程規則,支援步長、範圍、逗號列表等語法,並自動計算接下來5次執行時間。適合檢視crontab或GitHub Actions的定時任務設定。

Cron表示式語法(5個欄位)

cron表示式從左到右由5個用空格分隔的欄位組成:分鐘、小時、日期、月份、星期。每個欄位可使用以下特殊字元。

位置 欄位 允許範圍
1 分鐘 0-59
2 小時 0-23
3 日期(幾號) 1-31
4 月份 1-12
5 星期 0-7

星期欄位通常0=星期日、6=星期六,但本工具也接受部分cron實現使用的7作為星期日的別名(內部按0處理)。

每個欄位都可以使用"*"(任意值)、逗號分隔的列表(1,15,30)、連字元範圍(1-5)以及斜槓步長(*/15、1-30/5),並且這些語法可以自由組合。

常見的cron模式

cron表示式 含義
* * * * * 每分鐘執行一次。
*/5 * * * * 每5分鐘執行一次。
0 * * * * 每小時的第0分鐘執行一次。
0 0 * * * 每天0點0分(凌晨)執行。
0 9 * * 1-5 工作日(週一至週五)的9點執行。
0 0 1 * * 每月1號0點0分執行。
0 0 1 1 * 每年1月1日0點0分執行。
*/15 9-17 * * 1-5 工作日9點到17點之間,每15分鐘執行一次。

什麼是 Cron 運算式

Cron 運算式是把「反覆執行的處理何時運行」以一行寫出的記法。自左而右以空格分隔「分・時・日(日期)・月・星期」五個欄位,各欄位可組合 *(全部)、以逗號列舉、以連字號表範圍、以斜線表間隔來指定。*/15 9-17 * * 1-5 即為「平日9時至17時每15分鐘」之意。

本工具會解析所輸入的運算式,**先以文字說明該排程的含義,再算出自目前時刻起接下來將執行的5個日期時間**。各欄位的明細亦並列顯示,可確認是哪一部分在起作用。星期以0=週日〜6=週六為標準,但部分實作所用的7=週日寫法本工具亦予接受,內部按0處理。下次執行的搜尋範圍約為4年,若其中沒有相符的日期時間,便會予以提示。

Cron 運算式解析器的使用方式

  1. 輸入 Cron 運算式 以空格分隔填入「分 時 日 月 星期」五項。欄位數或取值範圍不符便會報錯。
  2. 按下「解析」 會以文字顯示該排程的含義。請先在此確認是否把自己的運算式讀錯了。
  3. 確認欄位的明細 會逐一列出分、時、日、月、星期各自所指。可據以發現是否有不該填值的欄位被填了值。
  4. 查看下次的執行預定 會以日期時間給出自目前時刻起的5次。諸如指定「每月31日」這類在某些月份並不存在的日期,其與本意的落差會以具體日期呈現。
  5. 照抄常見的模式 表中彙總了每分鐘、每5分鐘、每小時0分、平日9時等常用模式。以最接近者為底加以改寫是捷徑。

用好本工具的小技巧

  • 像"*/15 9-17 * * 1-5"這樣,逗號列表、連字元範圍與斜槓步長可以自由組合使用。
  • 星期欄位通常是0-6(星期日至星期六),但本工具也接受部分cron實現使用的7作為星期日的別名。
  • 如果日期欄位和星期欄位都被限制為非"*",按照標準cron規範,兩者是"或"的關係——只要滿足其中一個條件就會執行。
  • GitHub Actions的schedule觸發器使用與本工具相同的5欄位cron語法,因此也可以用來確認工作流的執行時間。
  • 實際執行時間會受伺服器時區設定影響,修改crontab後,建議同時確認一下伺服器的當前時間。

Cron 運算式解析器的應用情境

寫入 crontab 之前先確認含義

在登錄到伺服器之前先行解析,可避免「運行得比預想頻繁」或「完全不運行」這類事故。

確認 GitHub Actions 的排程

寫在工作流程 schedule 中的運算式同樣是這五欄位的記法。可由下次執行的一覽查看間隔是否合乎本意。

讀懂他人所寫的運算式

當接手的設定中出現 0 */6 * * * 這類運算式時,轉為文字即可立刻明白它在幾時運行。

排查執行時間偏差的原因

當「本該運行的時刻卻沒運行」時,查看下次執行的一覽即可分辨原因究竟出在運算式本身,還是別的因素。

想計算執行間隔的日期時

若想數「距下次執行還有幾天」,請使用倒數計時器;若想按營業日計數,請使用營業日計算

與 Cron 運算式相關的用語

cron
指類 Unix 系統中於既定時刻反覆執行處理的機制。記載執行內容與時刻對應關係的清單稱為 crontab。
欄位
指以空格分隔 Cron 運算式所得的各要素。自左而右為分(0〜59)、時(0〜23)、日(1〜31)、月(1〜12)、星期(0〜6)五項。
星號(*)
表示該欄位所能取的全部值。置於分即為「每分鐘」,置於月即為「每月」。
步長(/)
寫作 */15 之類以指定間隔。如「每15分鐘」那樣,在範圍之內按固定步幅跳選。
範圍(-)
寫作 1-5 以一併指定連續的值。置於星期即為週一至週五,置於時即為1時至5時。
星期的編號
0為週日,6為週六。部分實作亦接受7作為週日,本工具同樣把7視同0處理。
時區
cron 通常以運行方所處環境的時刻來解釋。若伺服器的時刻設定與預想不同,同一運算式的執行時刻便會隨之偏移。

常見問題

是的。標準cron規範用0表示星期日,但部分實現(如Vixie cron)也接受7作為星期日的另一種寫法。本工具會將兩者都解釋為星期日。

不是優先關係,而是"或"條件。當日期欄位和星期欄位都被限制為非"*"時,只要滿足其中一個條件的日子就會執行;如果只有一個欄位被限制,則只以該欄位為準。

基本的5欄位格式(分 時 日 月 星期)是相同的。但GitHub Actions的定時任務始終按協調世界時(UTC)計算,並且實際執行可能會延遲幾分鐘到幾十分鐘,這與伺服器上的crontab有所不同。

可以,分、時、日、月、星期這5個欄位都可以使用步長語法(起始值/間隔,或*/間隔)。不過對於星期、月份這類取值範圍較小的欄位,實際能組合出的模式比較有限。
工具君

閒話 ― cron的半個世紀

cron這個名字據說源自希臘語中意為"時間"的Chronos(克羅諾斯),自20世紀70年代UNIX誕生之初就作為經典的任務排程工具存在。僅用5個欄位就能表達從"每分鐘"到"每年某個特定日期"的排程規則,這種簡潔的語法即便在近半個世紀後的今天依然被廣泛使用。

如今,這種5欄位的cron語法不僅用於Linux伺服器的crontab,也被GitHub Actions、GitLab CI、Kubernetes的CronJob等眾多CI/CD工具和容器平臺直接採用為定時任務的配置方式。一種誕生於UNIX時代的語法,至今仍在雲原生環境中原封不動地被使用,這本身就是一件有趣的事。

cron語法中最容易讓人困惑的一點,就是同時指定日期和星期時的行為。人們往往直覺認為這是"且"的關係(同時滿足兩者),但實際規範卻是"或"的關係(滿足其中之一即可),這也是任務執行頻率與預期不符的常見原因之一。