
你是否也曾遇過這樣的「靈異事件」:你明明在 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 的用戶,設定方法非常簡單。
- 找到你的
docker-compose.yml
檔案。 - 在
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 時區資料庫列表 中找到對應的名稱。
- 儲存檔案並重新啟動 n8n 容器: 在終端機中,於
docker-compose.yml
檔案所在的目錄,執行以下指令:Bashdocker-compose up -d --force-recreate
完成後,你的整個 n8n 實例的「預設時區」就已經被校準為台灣時間了。現在,Schedule
節點中設定的「09:00」,就會被正確地解讀為「台灣時間的早上九點」。

工作流中的時間魔法:活用 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') }}
- 解說:
DateTime.fromISO(...)
:先將標準的 ISO 8601 時間字串,讀取成一個 Luxon 物件。因為字串結尾是Z
,Luxon 會正確地將其辨識為 UTC 時間。.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
Schedule
節點:Mode: Every Day
,Hour: 9
,Minute: 0
。(因為我們已設定GENERIC_TIMEZONE
,所以這就是台灣時間 9 點)。
PostgreSQL
節點:- Operation:
Get All
- Filters:
order_time
after{{ $now.minus({ days: 1 }).toISO() }}
(抓取從 24 小時前到現在的訂單)。
- Operation:
Split In Batches
節點:Batch Size: 1
,將訂單逐一處理。
Set
節點 (時間轉換):- 新增一個欄位
local_order_time
。 - Value (Expression):JavaScript
{{ DateTime.fromISO($json.order_time).setZone('Asia/Taipei').toFormat('yyyy/MM/dd HH:mm:ss') }}
- 新增一個欄位
Slack
節點:- Text:
新訂單通知!訂單編號: {{ $json.order_id }},下單時間 (台灣): {{ $json.local_order_time }}
。
- Text:
這個流程完美地結合了系統層級與工作流層級的時區處理,確保了排程的精準性與顯示的正確性。
n8n 時區設定常見問題 (FAQ)
- Q1: 我該如何找到我所在地的 IANA 時區名稱?
- A: 你可以在維基百科的「時區資料庫列表」頁面找到最完整的列表。亞洲地區常見的有
Asia/Taipei
,Asia/Shanghai
,Asia/Tokyo
,Asia/Seoul
。
- A: 你可以在維基百科的「時區資料庫列表」頁面找到最完整的列表。亞洲地區常見的有
- Q2: 我已經設定了
GENERIC_TIMEZONE
並重啟了容器,為什麼排程時間還是不對?- A: 請再三檢查
docker-compose.yml
檔案中,GENERIC_TIMEZONE
的拼字是否完全正確,以及時區名稱是否為有效的 IANA 名稱。任何拼字錯誤都會導致設定失效。
- A: 請再三檢查
- Q3: n8n 如何處理日光節約時間 (Daylight Saving Time)?
- A: 這正是使用 IANA 時區名稱(如
America/New_York
)而非固定偏移量(如UTC-5
)的好處。IANA 名稱內建了日光節約時間的規則,n8n 和 Luxon.js 會自動處理切換,你無需手動干預。
- A: 這正是使用 IANA 時區名稱(如

結語
在自動化的世界裡,時間不僅僅是時鐘上的數字,它是一個需要被精準管理的「資料」。搞懂 n8n 的時區設定,是你從建立「能動」的工作流,邁向建立「可靠」的工作流的必經之路。
讓我們再次回顧兩大關鍵重點:
- 系統層級治本: 永遠為你的自架設 n8n 實例,設定正確的
GENERIC_TIMEZONE
環境變數。 - 工作流層級治標: 當需要處理來自不同時區的資料時,善用 Expressions 中強大的
Luxon.js
函式庫 (DateTime.fromISO
,.setZone
,.toFormat
) 進行轉換。
掌握了這兩大武器,你就能充滿信心地應對任何與時間相關的自動化挑戰,讓你的 n8n 排程,像瑞士鐘錶一樣精準無誤。
更多精選文章請參考
n8n 與 Zapier 比較:該選哪個?2025年最完整功能、費用、優缺點分析
開源自動化工具推薦:從工作流程到測試,找到最適合你的免費方案
n8n 發送 Email 超詳細教學:從 SMTP 設定到 Gmail 節點串接,一篇搞定!
n8n Notion 串接終極指南:2025 年打造自動化工作流程,效率翻倍!