一個 cron 解析器範例會接收像 */15 9-17 * * 1-5 這樣的五欄位運算式,將每個欄位展開成具體的數值集合,並列出接下來五個排程實際會觸發的時間點。經典的 cron 語法刻意設計得很精簡,但這種精簡也是大多數錯誤藏身之處:欄位順序錯誤、範圍寫反,或步進從錯誤的基準值開始,都可能讓備份任務從「營業時間內每十五分鐘執行一次」悄悄變成「午夜時一天一次」。解析器將這種模糊性轉成三個具體產物——一個正規化的運算式、一段以白話文撰寫的逐欄位摘要,以及一份同時以瀏覽器本地時間與 ISO UTC 顯示的即將執行時間清單——讓你在排程上線前能夠先行驗證。Cron Parser 正是為此工作流程而設計,接受 Cronie 的 crontab(5) 參考手冊 中所記載、且大多數 Unix 風格排程器都在使用的可攜式數值五欄位格式。本文中的每個範例都使用相同的五欄位結構,因此欄位位置、範圍與正規化規則在各排程器之間保持一致。
Cron 本身只是一個五欄位的排程字串。排程器在註冊時讀取一次,之後每分鐘醒來檢查目前這一分鐘是否同時符合所有欄位。解析器則是事先完成同樣的工作:將每個欄位展開成可能符合的數值集合,再逐分鐘向前檢查候選時間,直到找出五個真正的命中。這樣就能輕鬆確認「每個工作日 09:30」真的是指週一到週五的 09:30,而不是「不管日期落在哪一天,只要那天是工作日,就在 09:30 執行」。

五欄位 Cron 運算式的結構解析
每個運算式都恰好由五個以空白分隔的欄位組成,順序固定如下:
- 分鐘 — 0 到 59
- 小時 — 0 到 23(24 小時制)
- 日期 — 1 到 31
- 月份 — 1 到 12
- 星期 — 0 到 7,其中 0 與 7 都代表星期日
這個順序不可更動。寫成 * * * * 5 表示「星期五的每一分鐘」,而不是「每天的第 5 分鐘」。Cron Parser 強制執行這個順序,且只接受恰好五個欄位,這正是防止多餘的管線符號、重新導向或命令參數被悄悄吸收進排程的關機制。
每個範例解析器回傳的內容
貼上運算式後,會出現三項結果:
- 正規化後的運算式——多餘的空白會被移除,清單會排序,範圍維持含端點,星期欄位的 7 會改寫為 0,避免星期日重複。
- 欄位摘要——每個欄位會被改寫成所選數值的清單,例如 */15 展開為 0,15,30,45,或 8-12 直接以範圍呈現。
- 接下來五次執行——五個同時符合所有欄位的未來時間點,以瀏覽器本地時間與 ISO UTC 字串兩種方式顯示。
同時顯示本地與 UTC 是刻意的設計。瀏覽器顯示的是你會在時鐘上看到的時間,而 UTC 時間戳則方便你與日誌、容器映像及其他伺服器比對,避免日光節約時間造成的混淆。日曆有效性由底層的 JavaScript Date 邏輯處理,因此日期若設為 31,沒有 31 日的月份會自然略過,二月的規則也會考慮閏年。
逐步走查五個真實的 Cron 運算式
這是「cron 解析器範例」的核心工作流程:取得排程、貼上、閱讀欄位摘要並對照接下來五次執行時間。
- 依「分鐘、小時、日期、月份、星期」的順序貼上五欄位運算式。
- 使用數值、* 萬用字元、逗號清單、含端點範圍,或像 */15 這類步進表示法。
- 閱讀正規化後的運算式、欄位摘要,以及接下來五次同時符合條件的本地與 UTC 執行時間。
- 將 UTC 時間戳與實際執行該工作的排程器文件和時區進行交叉比對。
範例 1 — 工作日營業時間內每十五分鐘執行一次。
*/15 9-17 * * 1-5
欄位 1 的 */15 在分鐘位置選取 0,15,30,45。欄位 2 的 9-17 選取小時 9,10,11,12,13,14,15,16,17。欄位 3 的 * 選取 1-31。欄位 4 的 * 選取 1-12。欄位 5 的 1-5 選取工作日 1,2,3,4,5。接下來五次執行會落在下一個工作日的 09:00 至 17:59 之間,分鐘為 0、15、30 或 45。若今天是星期五當地時間 14:07,則接下來五次命中為同一個星期五的 14:15、14:30、14:45、15:00 與 15:15。
範例 2 — 每星期一 08:00 執行。
0 8 * * 1
分鐘 0、小時 8、日期 *、月份 *、星期 1。解析器回報正規化形式 0 8 * * 1 以及摘要 0 | 8 | 1-31 | 1-12 | 1。接下來五次執行為接下來五個星期一的當地時間 08:00,並附上對應的 ISO UTC 時間戳,可讓你確認執行該工作的主機與瀏覽器使用相同的時區。
範例 3 — 每月 21 日 03:30 執行。
30 3 21 * *
這是典型的日期規則陷阱。日期 21 受到限制,而星期 * 則未受限制。由於星期是萬用字元,規則代表「每月 21 日的 03:30」,會落在該日實際對應的星期。解析器列出接下來五個 21 日的發生時間,包含落在週末的日期,因此結果會包含 2 月 21 日與 3 月 21 日,不論它們分別是星期幾。
範例 4 — 1 月、4 月、7 月、10 月的第一天 06:00 執行季度報告。
0 6 1 1,4,7,10 *
欄位 4 的 1,4,7,10 是以逗號分隔的月份清單。欄位 5 為 *,因此星期未受限制。接下來五次執行為 1 月 1 日、4 月 1 日、7 月 1 日、10 月 1 日,以及隔年的 1 月 1 日,時間皆為 06:00。正規化輸出中,逗號清單會保持排序,解析器也會確認 1,4,7,10 剛好是四個月,而不是八個月。
範例 5 — 在自訂分鐘區間內每十分鐘執行一次。
10-50/20 * * * *
這是範圍上的步進。欄位 1 從 10 開始,到 50 結束,步進為 20,展開為 10、30、50。搭配其他欄位的 *,工作會在每小時、每天、每月的 xx:10、xx:30、xx:50 觸發。解析器會在欄位摘要中呈現這個展開結果,讓你不必心算,同時也會拒絕寫成 50-10/20 的同一種步進,因為該範圍是遞減的。
欄位參考:範圍、清單與步進
| 欄位 | 有效範圍 | 萬用字元形式 | 語法範例 | 正規化展開 |
|---|---|---|---|---|
| 分鐘 | 0–59 | * | 0,15,30,45 | 0,15,30,45 |
| 小時 | 0–23 | * | 8-12 | 8,9,10,11,12 |
| 日期 | 1–31 | * | 1-31/10 | 1,11,21,31 |
| 月份 | 1–12 | * | 1,4,7,10 | 1,4,7,10 |
| 星期 | 0–7(0 與 7 都代表星期日) | * | 1-5 | 1,2,3,4,5 |
這些範圍符合 crontab(5) 參考手冊中描述的傳統 Cronie 風格 crontab 格式。任何超出範圍的內容,包括負數、像 5-1 這樣遞減的範圍、像 */0 這類步進值為零,或空清單項目,都會被拒絕並回傳明確的錯誤訊息,而非默默強制轉換。步進運算式還要求除數為正整數,這正是 */15 可用而 */0 不可用的原因。
日期與星期的 OR 行為
日期欄位需要特別留意。在傳統 cron 中,當日期與星期同時受到限制(兩者皆非 *)時,只要其中一個欄位符合即會觸發——這是文件記載的 OR 邏輯,而不是嚴格的 AND。像 0 9 21 * 1 這樣的規則會在每月 21 日與每星期一觸發,因此當 21 日同時是星期一時,只會產生一次工作而非兩次,因為分鐘與小時仍必須每分鐘精確符合一次。
當其中一個日期欄位為萬用字元時,受限的欄位將完全主導比對。Cron Parser 遵循這種 OR 行為,因為它符合 Cronie、Vixie cron 及大多數實際運作的生產排程器的做法。若排程器採用不同規則——例如 Quartz 將 ? 視為明確的「無值」並對兩個日期欄位使用 AND——同一個五欄位字串可能產生不同的排程,這也是解析器輸出被標示為「驗證輔助工具」而非「部署指令」的原因之一。
Cron Parser 拒絕的輸入
解析器刻意鎖定 cron 中可攜的數值核心,並拒絕其他所有內容。常見的拒絕輸入包括:
- 月份或星期名稱(例如 JAN 或 MON),因為它們在不同方言中意義不同。
- 暱稱(例如 @daily 或 @hourly),因為它們在不同 cron 實作中的展開方式不同。
- Quartz 或雲端排程器使用的六欄位或七欄位運算式,這些會加上秒數或年份。
- Quartz 問號、像 L 這類「最後一天」語法、像 5#2 這類「第 N 個星期幾」、雜湊排程與隨機範圍。
- 五欄位之後多出的命令文字,因為這屬於 crontab 行內的內容,不應出現在排程字串中。
- 遞減範圍(5-1)、零或負數步進、空清單項目,以及超出欄位範圍的數值。
每次拒絕都會伴隨一則明確的錯誤訊息,指出違規的欄位。這個回饋循環能把打字的錯誤轉為修正,避免在生產環境中發生靜默漏失,同時也是下次執行時間計算能安全進行的關鍵:解析器以整分鐘為單位向前掃描,若五年內找不到五個符合項目便會停止,防止格式錯誤或極度稀疏的輸入使瀏覽器卡住。
部署前與排程器進行驗證
兩項實際檢查決定了解析器究竟能幫上忙還是誤導你。首先,確認執行該工作的主機或容器的時區——解析器內部的 UTC 只是運算上的便利,而非部署指令。其次,確認日期與星期的語意,以及你所使用的排程器支援的任何擴充功能,因為同樣的五個數值欄位在 Cronie、Quartz、Kubernetes CronJobs、systemd timers 或雲端排程器中可能有不同意義。若想深入檢視不同環境的語法,請參考cron 解析器速查表:範圍、步進與範例。
解析器本身不會執行命令、聯繫伺服器或儲存運算式,因此請將其輸出視為驗證輔助工具。部署關鍵的備份、計費、通知或維護工作之前,務必確認生產環境排程器的時區、日光節約政策、日期欄位語意以及支援的擴充功能。