兩種描述重複排程的方法
Cron 表達式解析工具 — 執行時間、RRULE 與時區預覽
Cron 以欄位比對時間,常用來觸發系統工作;RRULE 則從 DTSTART 展開行事曆重複集合。兩者可能得到相似日期,但語法、時區語意與執行環境不能互換。
先讀懂常見的五欄位 Cron
15 10 * * 1-5每週一至週五的 10:15
15分鐘
0–59
10小時
0–23
*每月第幾日
1–31
*月份
1–12
1-5每週第幾日
0–7
Cron 方言邊界
POSIX / Vixie 類型
常見 5 欄;parser 也接受前置秒欄
含秒 / Quartz 類型
不支援 7 欄年份,也不是完整 Quartz 驗證
GitHub / Kubernetes
選項不會套用各平台的部署限制
從 DTSTART 展開支援的 RRULE 部分
DTSTART;TZID=America/New_York:20260803T101500 RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=8
DTSTART重複起點與缺少的日期時間欄位;建議明確提供
FREQ必要的重複頻率
INTERVAL / BYDAY控制展開間隔與日期篩選
COUNT / UNTILRFC 5545 規定二擇一,不能只靠 parser 排除衝突
TZID解讀 RRULE 當地時間,與結果顯示時區不同
在選定的 IANA 時區顯示有限筆預覽
8/3(一) · 10:15
8/5(三) · 10:15
8/7(五) · 10:15
8/10(一) · 10:15
8/12(三) · 10:15
春季缺口
某些當地時鐘時間不存在。預覽 parser 會依自身規則調整,實際排程器也可能跳過或採用其他政策。
秋季重疊
同一個當地時鐘時間可能出現兩次。預覽只列出 parser 選定的 instant,部署環境可能執行一次或兩次。
部署前檢查清單
- 確認並記錄實際排程器的 Cron 方言
- 明確保存 IANA 時區,並分清 RRULE TZID 與顯示時區
- 測試 DST 轉換、月底與閏年邊界
- 限制 RRULE 預覽筆數與不受信任的輸入
- 把規則放進目標平台再次驗證,不把預覽當成部署
- 監控漏執行與重複執行
Cron 與 RRULE 常見問題
- Cron 和 RRULE 可以互相替換嗎?
- 不行。Cron 依排程器方言比對時間欄位;RRULE 則依 RFC 5545 的重複部分,從 DTSTART 展開行事曆日期集合。
- 為什麼相同的 Cron 表達式會在不同本地時間執行?
- 排程器使用的時區、IANA 資料版本或 DST offset 可能不同。請用含 offset 的起始時間檢查實際 instant,並在部署平台再次驗證;本頁預覽不保證工作一定會執行。
- RRULE 可以永遠重複嗎?
- 可以。沒有 COUNT 或 UNTIL 時,規則可以無限延伸;本頁只展開所選的 5、10、20 或 50 筆,避免無界預覽。