iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0

簡介

在先前的 Logging 章節中,我們提到開發者通常會記錄事件發生的時間點。此外,程式系統中經常使用時間來進行判斷與運算,因此熟悉 datetime 的使用變得尤為重要。本文將介紹 datetime 中一個關鍵概念——時區。

當開發者呼叫 datetime.now() 時,系統會提取本機的當前時間,然而該物件本身並不具備時區的概念,因此官方稱之為 timezone-naive。在跨時區的應用場景中,系統需要根據使用者的時區進行相應的處理;同樣,當系統收集的數據涉及多個時區時,需要根據時間來比較或排序數據。在這些情況下,依賴 timezone-naive 的 datetime 是不夠的,此時應使用 timezone-aware 的 datetime,將時區信息納入 datetime 物件中。

datetime 本身提供了一個名為 timezone 的類別,開發者可以利用該類別創建時區。不過,時區之間的偏移量通常用數字來表示,這樣的表示方式可讀性較低。例如,當開發者看到 timezone(timedelta(hours=-5)) 時,無法立即判斷這代表的是哪個時區(例如,這可能是紐約時間)。這類數字被稱為 魔術數字(magic number),它們往往使開發者對其含義感到困惑。另外這種手動計算時區偏移量也機會出錯,由於不同地區的時區可能因為歷史、政治或地理原因而發生變化,開發者在使用 timedelta 計算時區偏移時,容易忽略這些變化或誤解某個數字的意義。

在此,我想推薦另一個 Python 內建的套件——zoneinfo。該套件基於國際公認的 IANA 標準,涵蓋了全球所有的時區規則,並能準確處理各種複雜的時區變動,如日光節約時間。開發者可以使用標準的時區名稱,例如 America/New_YorkAsia/Tokyo,這樣可以顯著提高程式碼的可讀性。。接下來,我將透過範例進一步介紹這一套件。

範例

開發者無需特別安裝 zoneinfo 模組,因為它已經包含在 Python 標準庫中。

注意:這個模組是從 Python 3.9 開始引入的,舊版本並不包含該套件。在舊版本中,可以使用另一個套件 pytz,兩者的功能是相似的,而本次範例主要以 zoneinfo 為主。

首先,建立 main.py,接著我們將創建兩個時間點。第一個時間點是亞洲台北的早上10點,第二個時間點是亞洲東京的早上11點。在進行時間比較時,datetime 將自動轉換這兩個時間點到相同的時區,以便進行正確的大小比較。

from datetime import datetime
from zoneinfo import ZoneInfo

datetime_1 = datetime(2024, 9, 26, 10, 0, tzinfo=ZoneInfo("Asia/Taipei"))
datetime_2 = datetime(2024, 9, 26, 11, 0, tzinfo=ZoneInfo("Asia/Tokyo"))
if datetime_1 == datetime_2:
  print(f"datetime_1: {datetime_1}")
  print(f"datetime_2: {datetime_2}")

開發者可以執行 poetry run python main.py,即可看到結果(如下圖所示)。在結果的最後部分,+08:00+09:00 分別代表兩個時間點的時區,清楚地顯示了它們之間的時差。
https://ithelp.ithome.com.tw/upload/images/20240926/20168663FH7Fdd3MYk.png


上一篇
[Day 12] Pydantic Settings
下一篇
[Day 14] Requests
系列文
Python 不止於數據,開發應用程式它也在行!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言