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