Cron 運算式是一個簡潔的五欄位字串,用來告訴排程器(例如 cron、Quartz 或 Spring)何時執行任務。這些欄位依序為:分鐘 (0-59)、小時 (0-23)、日期 (1-31)、月份 (1-12) 以及星期 (0-7,其中 0 和 7 都代表星期日)。每個欄位接受數字、通訊符號 (*)、以逗號分隔的清單、包含端點的範圍(例如 1-5),或步進值(例如 */15)。例如,0 9 * * 1 會在每週一的上午 9:00 執行。手動解析 cron 運算式來檢查語法或預測執行時間容易出錯,特別是在通訊符號或步進值橫跨多個值的情況下。「Cron 解析工具」透過驗證運算式、以淺顯英文摘要每個欄位,以及計算在本地時區和 UTC 時區下接下來五個符合的執行時間來解決這個問題。這讓您在將排程部署到正式環境之前,可以確認排程符合您的預期。

Cron 運算式廣泛用於自動化作業,從簡單的備份到複雜的工作流程。一個放錯位置的通訊符號或不正確的範圍,可能會導致任務在錯誤的時間執行、使伺服器過載,或錯過關鍵期限。例如,0 0 1 * * 會在每月第一天的午夜執行,而 0 0 * * 1 則會在每週一的午夜執行。兩者差異微妙但至關重要。「Cron 解析工具」透過清楚顯示運算式所選定的具體日期和時間來消除猜測。它也能處理邊界情況,例如月底日期(某些排程器中的 L)或非標準步進值(例如每三小時的 */3)。無論您要排程每日報告、每週清理作業或每月資料庫備份,先解析運算式能確保任務在您預期的時間執行。

how to parse cron expression
how to parse cron expression

Cron 運算式的運作方式

Cron 運算式由五個以空格分隔的必填欄位組成。每個欄位都有特定的範圍與用途:

欄位 範圍 允許的值 範例
分鐘 0-59 數字、*、範圍(例如 0-30)、清單(例如 0,15,30,45)、步進值(例如 */5) 0*0-30*/15
小時 0-23 數字、*、範圍、清單、步進值 90-11*/2
日期 1-31 數字、*、範圍、清單、步進值、L(某些排程器中代表最後一天) 1*1-15L
月份 1-12 數字、*、範圍、清單、步進值,或名稱(例如 JAN-DEC) 1*1-6JAN,MAR,MAY
星期 0-7 (0 和 7 代表星期日) 數字、*、範圍、清單、步進值,或名稱(例如 SUN-SAT) 0*1-5MON-FRI

通訊符號 (*) 會比對欄位中的每個可能值。例如,* * * * * 會每分鐘執行一次。範圍(例如 1-5)包含從起始到結束(含端點)之間的所有值。清單(例如 1,3,5)會比對任何指定的值。步進值(例如 */15)會從第一個值開始,每隔 n 個值比對一次。某些排程器(例如 Quartz)會為秒數或年份加上額外欄位,但經典的五欄位格式仍是最常見的,也是「Cron 解析工具」所支援的格式。

逐步解析 Cron 運算式

  1. 在瀏覽器中開啟 Cron 解析工具。無需安裝或註冊。
  2. 在輸入欄位中輸入您的 cron 運算式。請依分鐘、小時、日期、月份、星期的順序使用剛好五個欄位。例如:0 9 * * 1
  3. 點擊「Parse」或按下 Enter。工具會驗證運算式並顯示:
    • 運算式的標準化版本(例如 0 9 * * MON)。
    • 每個欄位的淺顯英文摘要(例如「在分鐘 0、小時 9、每月的每一天、每個月、星期一」)。
    • 您本地時區與 UTC 下接下來五個執行時間。
  4. 檢視摘要與執行時間,確認排程符合您的預期。例如,如果您輸入 0 9 * * 1,摘要應顯示「星期一」,且執行時間都應該是星期一的上午 9:00。
  5. 如果運算式無效,工具會顯示錯誤訊息並指出驗證失敗的欄位。請修正語法後再試一次。
  6. 驗證完成後,複製標準化的運算式或執行時間,以用於您的排程器設定中。

常見的 Cron 運算式範例

以下是 cron 運算式的實用範例及其意義:

運算式 意義 使用情境
0 * * * * 每小時的 0 分執行 每小時的日誌輪替
0 0 * * * 每天的午夜執行 每日資料庫備份
0 9 * * 1 每週一的上午 9:00 執行 每週團隊會議提醒
0 0 1 * * 每月第一天的午夜執行 每月帳單報告
0 0 * * 0 每週日的午夜執行 每週清理作業
*/15 * * * * 每 15 分鐘執行一次 健康檢查 ping
0 0 1 1 * 1 月 1 日的午夜執行 年度封存任務

這些範例展示了通訊符號、步進值與特定值如何組合,以建立有彈性的排程。「Cron 解析工具」透過將這些運算式翻譯成淺顯語言並顯示接下來的執行時間,協助您驗證它們。例如,*/15 * * * * 會顯示每 15 分鐘的執行時間,而 0 9 * * 1 則會確認任務只在星期一執行。

時區與排程器相容性

Cron 運算式本身與時區無關,但執行它們的排程器則有關。「Cron 解析工具」會同時以您的本地時區和 UTC 顯示執行時間,但您的排程器可能使用不同的時區。例如,如果您的伺服器位於 UTC+2,而您將任務排程為 0 9 * * *,任務會在 UTC+2 的上午 9:00 執行,而不是您本地時區的上午 9:00。請務必確認排程器的時區設定,以避免時區不符。常見的排程器包括:

  • Unix cron:使用系統的本地時區。在終端機執行 date 來檢查。
  • Quartz (Java):預設使用 JVM 的時區,但可依觸發器進行設定。詳情請參閱 Quartz 說明文件。
  • Spring Boot:使用伺服器的時區。可在 application.properties 中以 spring.task.scheduling.time-zone 進行設定。
  • AWS CloudWatch Events:預設使用 UTC。您可以在規則設定中覆寫此項。

「Cron 解析工具」也能協助您測試邊界情況,例如日光節約時間的切換。例如,如果您將任務排程在 0 2 * * *,而所在的時區有日光節約時間,當時鐘切換時,任務可能會執行兩次或完全不執行。工具顯示的執行時間會反映這種情況,讓您可以視需要調整排程。

疑難排解無效的運算式

如果「Cron 解析工具」拒絕您的運算式,請檢查以下常見錯誤:

  • 欄位數量錯誤:經典的 cron 運算式必須剛好有五個欄位。包含秒數或年份的 Quartz 運算式不受支援。
  • 無效的值:每個欄位都有特定的範圍(例如分鐘為 0-59)。超出這些範圍的值是無效的。
  • 分隔符號錯誤:欄位之間必須以空格分隔,不能用逗號、斜線或其他字元。
  • 不支援的語法:某些排程器支援特殊字元,例如 L(當月最後一天)或 #(當月第幾個星期幾),但「Cron 解析工具」僅支援標準的五欄位語法。
  • 前置零:雖然某些排程器允許前置零(例如以 05 表示 5),但其他排程器則不允許。請使用純數字(例如 5)以避免問題。

例如,0 9 * * 1,2,3,4,5 是有效的,且會在週一至週五的上午 9:00 執行;而 0 9 * * 1-5 也是有效的,可以用更少的輸入達到相同的結果。「Cron 解析工具」會將運算式標準化為最短的有效形式,所以您可以選擇自己偏好的語法。

對於更進階的排程需求,可考慮使用 Cron 運算式產生器,讓您無需死記欄位順序或語法即可建立運算式。如果您正在處理 JSON 設定,JSON 驗證工具 能協助確保您的 cron 運算式在設定檔中格式正確。如果您需要比較兩個 cron 運算式,差異比對工具 可以突顯它們之間的差異。

相關指南:如何在 C++ 中使用 ASCII 碼處理字元

相關閱讀:如何在 Kubernetes 中建立 Cron Job(含範例)