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分鐘執行一次。

使用小貼士

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

常見問題

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