生產力
時區換算完整指南:UTC、GMT 與全球時區一次搞懂
深入解說時區的歷史由來、UTC 與 GMT 的差別、夏令時間的運作方式,以及程式開發中的時區處理技巧。
什麼是時區?
時區(Time Zone)是地球上使用相同標準時間的區域。時區的概念源自 19 世紀鐵路運輸的需求。
歷史由來:
在 19 世紀中期之前,每個城鎮都使用自己的「太陽時」(solar time),也就是根據太陽在正南方時定為正午。這在馬車時代不是問題,但鐵路的出現讓不同城鎮的時間差異變成了大麻煩 —— 火車時刻表混亂不堪,甚至造成事故。
1884 年,國際子午線會議在美國華盛頓召開,決議以通過英國格林威治天文台(Greenwich Observatory)的經線為本初子午線(Prime Meridian),並以此為基準建立 24 個標準時區。
每個時區跨越 15 度經度(360° ÷ 24 = 15°),相鄰時區相差 1 小時。但實際上,時區邊界往往沿著國界或行政區界,不是嚴格的經線。
有趣的時區冷知識:
• 中國橫跨 5 個時區的寬度,但全國統一使用 UTC+8
• 印度使用 UTC+5:30,是少數使用半小時偏移的國家
• 尼泊爾使用 UTC+5:45,是唯一使用 45 分鐘偏移的國家
• 基里巴斯有 UTC+14 的時區,是全世界最早進入新一天的地方
UTC 和 GMT 的差別
UTC 和 GMT 在日常生活中常被混用,但它們在技術層面有重要差異:
GMT(Greenwich Mean Time,格林威治標準時間):
• 基於天文觀測:以太陽通過格林威治子午線的時間來定義
• 歷史悠久,自 1884 年國際子午線會議以來使用
• 由於地球自轉速度不均勻,GMT 的精確度會有微小波動
UTC(Coordinated Universal Time,協調世界時):
• 基於原子鐘:使用全球約 400 台原子鐘的加權平均值
• 自 1972 年起成為國際標準
• 精確度極高:原子鐘每年誤差小於 1 微秒
• 透過「閏秒」(Leap Second)與地球自轉保持同步
關鍵技術差異:
• GMT 是一個「時區」,UTC 是一個「時間標準」
• UTC 不會因為夏令時間而改變
• UTC 的數值與 GMT 在大多數情況下相同(差異在 1 秒以內)
• 在精確計時、科學研究和程式開發中,應使用 UTC
為什麼縮寫是 UTC 而不是 CUT?
因為英文是 Coordinated Universal Time(CUT),法文是 Temps Universel Coordonné(TUC),為了國際統一,最終妥協使用了 UTC。
夏令時間 DST
夏令時間(Daylight Saving Time,DST)是在夏季將時鐘撥快一小時,以充分利用日照的制度。
運作方式:
• 春季開始:將時鐘撥快 1 小時(例如 2:00 AM 直接跳到 3:00 AM)
• 秋季結束:將時鐘撥回 1 小時(例如 2:00 AM 回到 1:00 AM)
• 口訣:Spring Forward, Fall Back
目前使用 DST 的國家/地區:
• 美國(除亞利桑那州和夏威夷州外):3 月第二個週日 ~ 11 月第一個週日
• 歐盟:3 月最後一個週日 ~ 10 月最後一個週日(但正在討論廢除)
• 澳洲(部分州):10 月第一個週日 ~ 4 月第一個週日(南半球相反)
不使用 DST 的國家/地區:
• 台灣、日本、韓國、中國、新加坡
• 大多數赤道附近的國家(日照時間全年穩定)
常見混淆:
• 美國東部時間:EST = UTC-5(冬季)、EDT = UTC-4(夏季)
• ET(Eastern Time)是統稱,會自動切換 EST/EDT
• 台灣全年都是 CST(UTC+8),不需要考慮 DST
夏令時間的爭議:
近年越來越多研究指出 DST 的弊大於利:增加心臟病發作風險、打亂生理時鐘、實際節能效果有限。歐盟已通過決議計劃廢除 DST。
程式開發中的時區處理
時區處理是軟體開發中最容易出錯的領域之一。以下是最佳實踐和常見陷阱:
黃金法則:儲存用 UTC,顯示用本地時間。
1. 後端 / 資料庫:
• 所有時間戳一律儲存為 UTC
• 資料庫欄位使用 TIMESTAMP WITH TIME ZONE 型態
• API 回傳 ISO 8601 格式:2024-01-15T08:30:00Z(Z 表示 UTC)
2. 前端 / 顯示層:
• 從 UTC 轉換為使用者的本地時區
• JavaScript:new Date().toLocaleString('zh-TW', {timeZone: 'Asia/Taipei'}')
• 使用 IANA 時區資料庫的名稱(如 'Asia/Taipei'),不要用固定偏移量
3. 常見 Bug:
• 使用固定偏移量(UTC+8)而非時區名稱 → DST 國家會出錯
• 伺服器和客戶端時區假設不同 → 時間顯示錯誤
• 忽略閏秒 → 在極端精確度需求下可能出問題
• 字串比較日期 → "2024-01-09" > "2024-01-10" 字串比較結果錯誤
4. 推薦的程式庫:
• JavaScript:date-fns-tz、Luxon(Moment.js 已不建議使用)
• Python:pytz、dateutil
• Java:java.time(ZonedDateTime)
記住:時區規則會改變(政府可能修改 DST 規則),所以永遠保持 IANA 時區資料庫更新。
使用 Gigi Tools 的時區換算工具
Gigi Tools 提供便利的時區相關工具:
時區換算工具:
• 快速在不同時區之間轉換時間
• 支援全球所有主要時區
• 自動處理夏令時間(DST)
• 可以一次比較多個時區的時間
Unix 時間戳轉換器:
• 將 Unix 時間戳(Epoch Time)轉為可讀的日期時間
• 也可以將日期時間轉為 Unix 時間戳
• 支援毫秒和秒兩種格式
• 開發者調試 API 時的必備工具
常見使用情境:
• 與國際客戶或同事安排會議時間
• 開發者調試時間相關的 Bug
• 換算不同時區的活動、直播時間
• 確認國際航班的起降時間
所有計算在瀏覽器中進行,您的資料不會被上傳到伺服器。