Contents

Linux 程式抓取Timezone流程

程式在 Linux 上跑時間相關邏輯時,如果時區抓錯,影響通常不只是畫面顯示,而是連排程、記錄時間、資料比對都可能一起偏掉。這種問題平常不一定馬上爆,但一旦跨環境部署或進到容器,往往就會開始出現落差。

程式通常怎麼判斷時區

在 Linux 環境中,程式抓時區時常見會看兩個來源:

  1. TZ 環境變數。
  2. 系統時區設定,例如 /etc/localtime

簡單講,如果有明確設定 TZ,很多程式會優先吃它;如果沒有,才回頭看系統本身目前設定的時區。

怎麼檢查現在的系統時區

看環境變數

1
echo $TZ

如果有值,表示目前 Shell 或服務環境可能有覆寫時區。

/etc/localtime

1
ls -l /etc/localtime

這通常會連到 /usr/share/zoneinfo/ 底下的某個時區檔,例如 Asia/Taipei

用系統工具確認

1
timedatectl

這個方式通常最直觀,能直接看到目前系統認為的時區與時間設定。

為什麼這件事常在部署時出問題

1. 容器預設常常是 UTC

很多 Docker image 預設就是 UTC。如果你的應用原本在主機上跑是台灣時間,搬進容器後沒處理時區,很容易直接差 8 小時。

2. 不同服務的啟動環境可能不同

你在互動式 Shell 裡看到的 TZ,不代表 systemd service、Cron 或 Web Server 啟動的應用也會看到同樣的值。

實務上的建議

  1. 儲存時間盡量以 UTC 為主。
  2. 呈現給使用者時再轉成目標時區。
  3. 容器和正式環境都明確檢查時區,不要靠猜。

這樣通常比直接讓應用到處依賴本機時區安全很多。

小結

Linux 程式抓時區的流程本身不複雜,難的是不同執行環境可能看到不同設定。只要先釐清 TZ 和系統時區誰在生效,再回頭看你的應用怎麼處理時間,通常就能比較快找到時間偏移的真正原因。