n8n Timezone 時區設定終極指南:一篇搞懂 GENERIC_TIMEZONE 與 Luxon,解決排程錯亂問題

n8n timezone

你是否也曾遇過這樣的「靈異事件」:你明明在 n8n 的 Schedule 節點中,將一個日報表排程設定在每天早上九點執行,結果它卻總是在下午五點才姍姍來遲?或者,你的工作流從 API 抓取的時間戳記,寫入 Google Sheets 後,時間卻整整快了或慢了好幾個小時?

如果這些情境讓你感到困惑不已,那麼恭喜你,你已經遇到了任何自動化開發者都必須面對的經典大魔王——時區 (Timezone)

時區問題,是導致自動化排程與時間相關流程錯亂的頭號元兇。其根源在於,你的 n8n 伺服器運行的「世界標準時間 (UTC)」,與你本人所在的「本地時間」(例如台灣的 UTC+8)之間,存在著你看不到的時差。

別擔心,這不是一個無解的難題。n8n 提供了從「系統層級」到「工作流層級」的完整解決方案。這篇文章將是你的 n8n 時區設定終極指南,我們將帶你從問題的根源開始,手把手教你如何設定最重要的 GENERIC_TIMEZONE 環境變數,並活用內建的 Luxon.js 時間函式庫,讓你從此告別時間錯亂的困擾,建立精準、可靠的跨時區自動化流程。

「為什麼我的排程在半夜執行?」n8n 時區問題的根源解析

要解決問題,必先理解問題的本質。所有時區問題的根源,都來自於一個事實:伺服器通常使用 UTC 時間

  • UTC (世界協調時間): 這是全球通用的時間標準,你可以把它想像成一個「零時區」。全世界的伺服器,為了在處理全球用戶時有一個統一的基準,通常都會將系統時間設定為 UTC。
  • 本地時間 (Local Time): 這是你我生活中實際感受到的時間。例如,台灣位於東八區,我們的時間表示法就是 UTC+8。當 UTC 時間是凌晨 1 點時,台灣時間就是 1 + 8 = 早上 9 點。
  • 問題所在: 當你在 n8n 的 Schedule 節點設定「每天 09:00」執行時,如果你沒有特別告訴 n8n 你的時區,n8n 會認為你說的是「伺服器時間的 09:00」,也就是「UTC 09:00」。對於身在台灣 (UTC+8) 的你來說,這個時間點其實是台灣時間的 9 + 8 = 下午 17:00 (下午 5 點)!

這就是為什麼你設定的早上九點排程,卻在傍晚才執行的原因。

治本之道:設定 GENERIC_TIMEZONE 環境變數,校準你的 n8n 實例

要從根本上解決這個問題,我們必須告訴 n8n 實例:「嘿,我希望你跟我活在同一個時區!」這需要透過設定一個名為 GENERIC_TIMEZONE 的環境變數來完成。

這是所有自架設 (Self-Hosted) n8n 使用者都應該進行的基礎設定

如何設定 (以 Docker Compose 為例)

對於使用 Docker Compose 部署 n8n 的用戶,設定方法非常簡單。

  1. 找到你的 docker-compose.yml 檔案。
  2. n8n 服務的 environment 區塊,新增一行 GENERIC_TIMEZONE 的設定。

YAML

version: '3.7'

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    environment:
      # --- 就是在這裡加上底下這一行 ---
      - GENERIC_TIMEZONE=Asia/Taipei
    ports:
      - "5678:5678"
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:
  • Asia/Taipei: 這是台灣的標準 IANA 時區名稱。你可以根據你的所在地,在 IANA 時區資料庫列表 中找到對應的名稱。
  1. 儲存檔案並重新啟動 n8n 容器: 在終端機中,於 docker-compose.yml 檔案所在的目錄,執行以下指令:Bashdocker-compose up -d --force-recreate

完成後,你的整個 n8n 實例的「預設時區」就已經被校準為台灣時間了。現在,Schedule 節點中設定的「09:00」,就會被正確地解讀為「台灣時間的早上九點」。

n8n timezone

工作流中的時間魔法:活用 Expressions 與 Luxon.js 處理時區

設定好伺服器時區,解決了 80% 的問題。但更進階的挑戰是,當你在工作流中需要處理來自不同時區的資料時,該怎麼辦?例如,你的 API 傳回的是 UTC 標準時間戳記,但你想在發送給台灣用戶的通知中,將其顯示為台灣時間。

這時,就需要利用 n8n Expressions 中內建的強大時間處理函式庫 Luxon.js

認識 $now 物件與其時區

當你在 Expression 中使用 $now 變數時,它回傳的 Luxon 時間物件,會自動採用你 GENERIC_TIMEZONE 設定的時區。如果你設定了 Asia/Taipei$now.hour 就會是你當前的台灣小時。

將 UTC 時間轉換為本地時間

  • 情境: API 回傳了一個 UTC 時間字串 2025-09-08T00:00:00.000Z,你想將它轉為台灣時間。
  • 表達式:JavaScript{{ DateTime.fromISO($json.utc_timestamp).setZone('Asia/Taipei') }}
    • 解說:
      1. DateTime.fromISO(...):先將標準的 ISO 8601 時間字串,讀取成一個 Luxon 物件。因為字串結尾是 Z,Luxon 會正確地將其辨識為 UTC 時間。
      2. .setZone('Asia/Taipei'):將這個時間物件的時區,從 UTC 轉換到 Asia/Taipei

顯示帶有時區的格式化日期

  • 情境: 你想將轉換後的台灣時間,格式化成 2025/09/08 上午 08:00 的易讀格式。
  • 表達式:JavaScript{{ DateTime.fromISO($json.utc_timestamp).setZone('Asia/Taipei').toFormat('yyyy/MM/dd a hh:mm') }}
    • 解說: .toFormat() 是 Luxon 中用來格式化輸出的方法。a 代表上午/下午。

實戰演練:建立一個處理跨時區 API 數據的自動化報表

  • 目標: 一個全球化的電商平台,其資料庫訂單時間 order_time 均以 UTC 儲存。我們要建立一個排程,在台灣時間每天早上 9 點,抓取過去 24 小時的訂單,並在 Slack 通知中,將訂單時間顯示為台灣本地時間
  • 流程: Schedule -> PostgreSQL -> Split In Batches(1) -> Set -> Slack
  1. Schedule 節點:
    • Mode: Every Day, Hour: 9, Minute: 0。(因為我們已設定 GENERIC_TIMEZONE,所以這就是台灣時間 9 點)。
  2. PostgreSQL 節點:
    • Operation: Get All
    • Filters: order_time after {{ $now.minus({ days: 1 }).toISO() }} (抓取從 24 小時前到現在的訂單)。
  3. Split In Batches 節點:
    • Batch Size: 1,將訂單逐一處理。
  4. Set 節點 (時間轉換):
    • 新增一個欄位 local_order_time
    • Value (Expression):JavaScript{{ DateTime.fromISO($json.order_time).setZone('Asia/Taipei').toFormat('yyyy/MM/dd HH:mm:ss') }}
  5. Slack 節點:
    • Text: 新訂單通知!訂單編號: {{ $json.order_id }},下單時間 (台灣): {{ $json.local_order_time }}

這個流程完美地結合了系統層級與工作流層級的時區處理,確保了排程的精準性與顯示的正確性。

n8n 時區設定常見問題 (FAQ)

  • Q1: 我該如何找到我所在地的 IANA 時區名稱?
    • A: 你可以在維基百科的「時區資料庫列表」頁面找到最完整的列表。亞洲地區常見的有 Asia/Taipei, Asia/Shanghai, Asia/Tokyo, Asia/Seoul
  • Q2: 我已經設定了 GENERIC_TIMEZONE 並重啟了容器,為什麼排程時間還是不對?
    • A: 請再三檢查 docker-compose.yml 檔案中,GENERIC_TIMEZONE 的拼字是否完全正確,以及時區名稱是否為有效的 IANA 名稱。任何拼字錯誤都會導致設定失效。
  • Q3: n8n 如何處理日光節約時間 (Daylight Saving Time)?
    • A: 這正是使用 IANA 時區名稱(如 America/New_York)而非固定偏移量(如 UTC-5)的好處。IANA 名稱內建了日光節約時間的規則,n8n 和 Luxon.js 會自動處理切換,你無需手動干預。
n8n timezone

結語

在自動化的世界裡,時間不僅僅是時鐘上的數字,它是一個需要被精準管理的「資料」。搞懂 n8n 的時區設定,是你從建立「能動」的工作流,邁向建立「可靠」的工作流的必經之路。

讓我們再次回顧兩大關鍵重點:

  1. 系統層級治本: 永遠為你的自架設 n8n 實例,設定正確的 GENERIC_TIMEZONE 環境變數。
  2. 工作流層級治標: 當需要處理來自不同時區的資料時,善用 Expressions 中強大的 Luxon.js 函式庫 (DateTime.fromISO, .setZone, .toFormat) 進行轉換。

掌握了這兩大武器,你就能充滿信心地應對任何與時間相關的自動化挑戰,讓你的 n8n 排程,像瑞士鐘錶一樣精準無誤。

更多精選文章請參考

n8n 與 Zapier 比較:該選哪個?2025年最完整功能、費用、優缺點分析

開源自動化工具推薦:從工作流程到測試,找到最適合你的免費方案

n8n 發送 Email 超詳細教學:從 SMTP 設定到 Gmail 節點串接,一篇搞定!

n8n Notion 串接終極指南:2025 年打造自動化工作流程,效率翻倍!

【n8n 教學】最強 n8n 網頁爬蟲指南,免寫程式也能輕鬆抓取網站資料!

【n8n 教學全攻略】2025最新!從入門到串接實戰,打造你的自動化工作流

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端