所有指南
開發者

早上 9 點的 Cron:時區與日光節約時間

早上 9 點的工作、時鐘調整,以及部署前值得檢查的三個時間戳記。

一個工作日任務整個冬天都在上午 9 點執行。切換夏令時間後,卻變成了上午 10 點。Cron 運算式可能沒有寫錯:排程服務按 UTC 執行,而你想要的是當地時間。

把排程複製到服務裡之前,先確定它該按哪個時區執行。發給墨爾本團隊的每日報告,和每小時執行一次的備份,不一定適合用同一套規則。

時區不包含在運算式裡

這個五欄位運算式表示週一至週五的 09:00:

0 9 * * MON-FRI

但它沒有說明是哪裡的 09:00。時區由排程服務決定。在 CozyToolkit 的 cron 產生器裡切換時區,只會改變預覽結果,不會把時區寫進你複製的運算式。

如果部署平台支援按地區設定時區,可以選擇 Australia/Melbourne。UTC+10 這樣的固定偏移量不會隨墨爾本的夏令時間調整。

看看夏令時間前後的三次執行

我們把時區設為 Australia/Melbourne,從 2026 年 10 月 2 日零點開始預覽。接下來的三個工作日,執行時間如下:

墨爾本時間 UTC 時間
10 月 2 日星期五,09:00(UTC+10) 10 月 1 日星期四,23:00
10 月 5 日星期一,09:00(UTC+11) 10 月 4 日星期日,22:00
10 月 6 日星期二,09:00(UTC+11) 10 月 5 日星期一,22:00

當地時間始終是上午 9 點,對應的 UTC 時間卻變了。如果把預覽時區改為 UTC,同一條運算式就會在工作日的 UTC 09:00 執行,換算成墨爾本時間是週五 19:00、週一 20:00。

你可以下載排程和兩組時間戳自行對照。檔案使用 ISO 時間戳,末尾的 Z 表示 UTC。

在工具裡重現這個結果

  1. 打開 cron 產生器,選擇 貼上運算式。
  2. 把上面的內容貼上到 Cron 運算式。
  3. 將 排程時區 設為 Australia/Melbourne。
  4. 將 預覽後 設為 2026 年 10 月 2 日 00:00。這裡的日期和時間按你選定的時區解釋。
  5. 查看 即將執行的排程。在手機上,切換到對應的執行預覽分頁。
  6. 切換到 UTC 做對比,同時留意預覽起始日期:時區改變後,日期控件會顯示同一時刻在新時區下的時間。

這個工具只會預覽執行日期,不會替你創建或執行定時任務。實際部署時,還要在排程服務裡設定時區。

如果排程服務只支援 UTC

Cloudflare Cron Triggers 按 UTC 執行。所以,把上面的運算式複製到 Worker 後,它會在 UTC 09:00 執行,不受我們工具中預覽時區的影響。

如果任務必須按當地時間執行,可以選擇支援地區時區的排程服務,隨夏令時間手動調整排程,或讓觸發器更頻繁地執行,再由程式判斷當地日期、時間,並記錄當天是否已經執行過。僅靠一條固定 UTC 排程,無法讓任務在有夏令時間的城市全年都保持上午 9 點執行。

還有一個容易忽略的區別:不同 cron 實現對星期數字的定義不同。Cloudflare 用 1 表示星期日,我們的產生器則採用常見的 0 表示星期日的規則。如果目標服務支援,建議使用 MON-FRI 這樣的星期名稱,部署前再核對它的文檔。

上線前檢查特殊日期

預覽夏令時間切換前後各一周的執行時間。對於每月執行的任務,還要檢查二月和沒有 31 日的月份。

切換夏令時間時,02:30 這樣的凌晨時間可能不存在,也可能出現兩次。不同服務的處理方式可能不同。先決定是跳過、延遲還是避免重複執行,再到實際使用的服務裡測試。其他解析器給出的預覽不能保證你的服務也會這樣執行。

2026 年 10 月 1 日,我們用工具實際採用的時區解析器檢查了這些時間戳,並核對了對應的當地時間。測試結果記錄了輸入和輸出。本例沒有部署或執行真實的定時任務。