Cron 表達式解析與排程原理
在系統運維與後端開發中,Cron 表達式是設定定時任務(Scheduled Jobs)的標準協定。一個標準的 Cron 表達式由五個以空格分隔的欄位組成,分別代表不同的時間維度。本工具能將單行的 Cron 表達式拆解,並即時計算出後續的具體執行時間。
欄位結構與語法規則
標準 Cron 語法包含以下五個欄位,從左至右依序為:
- 分鐘:允許值為
0-59。 - 小時 (Hour):允許值為
0-23。 - 日期:允許值為
1-31。 - 月份:允許值為
1-12或英文縮寫如JAN、FEB等。 - 星期:允許值為
0-6(0 通常代表星期日)或英文縮寫如MON、TUE等。
本工具支援多種常見的符號語法:
- 星號 (
*):代表該欄位的「任意」值。 - 範圍 (
-):例如9-17,表示在該區間內持續觸發。 - 步進 (
/):例如*/15,在「分鐘」欄位代表「每 15 分鐘」。 - 清單 (
,):例如1,15,表示在指定的特定數值觸發。 - 預設簡寫:支援
@yearly、@monthly、@weekly、@daily及@hourly。
需要注意的是,本工具專注於標準 5 位 Cron 語法,並不支援包含第六個欄位的「秒」解析,亦不支援如 L、W、# 等特定擴充語法。
欄位解讀與輸出說明
當輸入有效的 Cron 表達式後,工具會將其拆解為「欄位解讀」,並提供以下對應資訊:
- 分鐘:解析後的分鐘設定。
- 小時:解析後的小時設定。
- 日期:解析後的日期設定。
- 月份:解析後的月份設定。
- 星期:解析後的星期設定。
對於步進格式 */n,系統會自動轉換為直觀的文字說明,例如「每 {n} 分鐘」、「每 {n} 小時」、「每 {n} 天」(適用於日期與星期欄位)或「每 {n} 個月」。若欄位為 *,則會顯示為「任意」。
此外,工具會根據「數量」設定(可調整範圍為 1 至 20 筆),計算並列出「接下來的執行時間」。
常見排程邏輯與邊界情況
日期與星期的聯集關係
在 Cron 的設計規範中,有一個特殊的邏輯:當「日期」與「星期」兩個欄位同時被限定(即兩者皆非 * 號)時,排程器會以「或(OR)」的邏輯運作。這意味著只要系統時間符合「指定的日期」或「指定的星期」其中之一,任務就會執行,而非兩者必須同時滿足。
永遠無法執行的排程
若 Cron 表達式語法正確,但設定了物理上不可能出現的時間組合,工具會顯示錯誤提示:「這個排程永遠不會執行——請檢查日期是否選了某些月份沒有的天數。」
這通常發生在將「日期」指定為 31,但「月份」欄位中包含了只有 30 天或更少天數的月份(例如 4 月、6 月、9 月、11 月或 2 月)。由於排程器在這些月份找不到第 31 天,該設定將無法在這些月份執行。
瀏覽器本地解析與隱私保護
本工具採用純用戶端(Client-side)處理機制。當你在「Cron 表達式」輸入框輸入內容或調整「數量」時,所有的語法解析與時間計算皆直接在你的瀏覽器本地完成。
你的 Cron 表達式會在瀏覽器本地解析,不會傳送到 BroBroGo。這確保了排程設定與參數不會經由網路外洩。若輸入框被清空,工具會直接返回「輸入 Cron 表達式即可解析。」的初始狀態;若輸入不合法的語法,則會即時顯示「無效的 Cron 表達式。」。
常見問題 FAQ
這個工具支援哪些 Cron 語法?
標準 5 位欄位——分鐘、小時、日期、月份、星期——支援範圍(1-5)、步進(*/15)、清單(1,15)、英文月份/星期縮寫(JAN、MON),以及 @yearly/@monthly/@weekly/@daily/@hourly 這些簡寫。有個容易忽略的規則:當「日期」和「星期」兩個欄位都被限定(不是 *)時,只要符合其中一個就算符合,不需要同時符合。
「接下來的執行時間」是哪個時區?
是你瀏覽器所在系統的本地時區。標準 Cron 表達式本身不帶時區資訊,實際用哪個時區由執行它的排程器決定,所以這裡顯示的是你本地時鐘下的預覽,不一定和伺服器一致。
為什麼顯示「這個排程永遠不會執行」?
通常是日期欄位選了某些月份根本沒有的天數——例如把日期設成 31,月份又包含 4、6、9、11 月。把日期改成所有選中月份都存在天數,或拆成幾條個別的表達式即可。