Python datetime 完全指南|日期、時間、時區的用法與實作範例

1. 前言

在使用 Python 處理日期和時間時,datetime 模組是不可或缺的工具。透過這個模組,你可以輕鬆地取得目前的時間、進行日期格式轉換、計算時間差等各種操作。

不過,對 Python 初學者來說,datetime 的使用方式可能會有些困難。例如:

  • 「想取得現在的日期或時間,但該用哪個函式才對?」
  • 「不知道如何處理含有時區的時間!」
  • 「該怎麼進行日期加減計算呢?」

本文將從基礎到進階,深入介紹 Python 的 datetime 模組,並透過易懂的說明與程式碼範例,幫助你輕鬆掌握。不論你是新手或想進一步學習的使用者,都能從中獲益。

2. 什麼是 datetime 模組?

datetime 是 Python 標準函式庫中用來處理「日期(Date)與時間(Time)」的模組。你不需要額外安裝,只要導入 datetime 就可以立即使用。

這個模組主要包含以下幾個常用的類別(class):

  • datetime.datetime:同時包含「日期」與「時間」的資訊。
  • datetime.date:只處理「日期」,不包含時間。
  • datetime.time:只處理「時間」,不包含日期。
  • datetime.timedelta:表示「時間差」,可用來進行加減運算。
  • datetime.timezone:用來處理時區(Time Zone)的資訊。

這些類別讓我們可以彈性且高效地處理各種與時間相關的應用場景,例如建立日曆工具、記錄時間戳、時區換算等。

3. 使用 datetime 取得現在的時間

要在 Python 中取得「現在的日期與時間」,可以使用 datetime.datetime.now()

from datetime import datetime

now = datetime.now()
print(now)
# 輸出範例:2024-05-01 14:30:45.123456

這會回傳一個 datetime 物件,裡面包含了年月日、時分秒與微秒(microsecond)等資訊。

如果你只想要「今天的日期」,可以使用 date() 方法來取得:

today = datetime.now().date()
print(today)
# 輸出範例:2024-05-01

這樣就能依需求,靈活取得目前的時間或日期。

4. 日期與時間的格式轉換

在開發過程中,我們經常需要將 datetime 物件轉換成字串,或是將字串轉換回 datetime。這可以透過 strftime()strptime() 方法來實現。

4.1 datetime 轉換成字串(strftime)

strftime() 可以依照指定的格式,將 datetime 物件轉換為字串。

from datetime import datetime

now = datetime.now()
formatted = now.strftime('%Y-%m-%d %H:%M:%S')
print(formatted)
# 輸出範例:2024-05-01 14:30:45

常用的格式代碼如下:

  • %Y:四位數年份(例如:2024)
  • %m:兩位數月份(01~12)
  • %d:兩位數日期(01~31)
  • %H:小時(00~23)
  • %M:分鐘(00~59)
  • %S:秒數(00~59)

4.2 字串轉換成 datetime(strptime)

如果你有一個日期字串,想轉換成 datetime 物件,可以使用 strptime()

from datetime import datetime

date_str = '2024-05-01 14:30:45'
dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
print(dt)
# 輸出:2024-05-01 14:30:45

注意:格式字串必須和輸入的字串格式完全一致,否則會發生錯誤。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. 日期與時間的加減運算(timedelta)

想要對日期或時間進行加減操作時,可以使用 datetime.timedelta 類別。這個類別可以表示「時間的差值」,例如幾天後、幾小時前等。

5.1 加上幾天

from datetime import datetime, timedelta

today = datetime.now()
future = today + timedelta(days=7)
print(future)
# 輸出範例:2024-05-08 14:30:45

5.2 減去幾天

past = today - timedelta(days=3)
print(past)
# 輸出範例:2024-04-28 14:30:45

5.3 加減其他單位(小時、分鐘、秒)

timedelta 除了 days 外,也支援 hoursminutesseconds 等單位:

# 加上2小時30分鐘
new_time = today + timedelta(hours=2, minutes=30)
print(new_time)
# 輸出範例:2024-05-01 17:00:45

這讓你可以非常靈活地進行時間的運算,適用於排程、倒數計時、時間間隔判斷等情境。

6. 時差與時區(Timezone)的處理

在全球化的應用中,處理「時區」是非常重要的課題。Python 的 datetime 模組支援基本的時區操作,但需要搭配 timezone 物件。

6.1 加入時區資訊

可以使用 datetime.timezone 來建立帶有時差的時區物件,然後與 datetime 一起使用:

from datetime import datetime, timezone, timedelta

# UTC+9(例如:日本時間)
jst = timezone(timedelta(hours=9))

now = datetime.now(jst)
print(now)
# 輸出範例:2024-05-01 14:30:45+09:00

6.2 UTC(協調世界時)轉換

將當前時間轉換為 UTC 時,可以使用 astimezone() 方法:

utc_time = now.astimezone(timezone.utc)
print(utc_time)
# 輸出範例:2024-05-01 05:30:45+00:00

6.3 注意:標準模組不支援夏令時間

標準的 datetime 模組不會自動處理夏令時間(Daylight Saving Time, DST)。

若需要更完整的時區支援(例如美國的夏令時間轉換),建議使用第三方套件 pytzzoneinfo(Python 3.9 以上內建):

from zoneinfo import ZoneInfo

dt = datetime(2024, 5, 1, 14, 30, tzinfo=ZoneInfo("Asia/Taipei"))
print(dt)

ZoneInfo 支援 IANA 時區資料庫,適合處理真實世界的時區需求。

7. datetime 常見錯誤與對策

使用 datetime 模組時,初學者容易遇到一些常見錯誤。本節整理出幾個常見問題與解決方式。

7.1 型別錯誤(TypeError)

datetimestr 是不同的資料型別,不能直接相加或比較。

# 錯誤範例
dt = datetime.now()
print(dt + "2024-05-01")
# TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'str'

對策: 必須使用 strftime()strptime() 進行型別轉換。

7.2 格式不正確(ValueError)

使用 strptime() 轉換字串為 datetime 時,格式不正確會導致錯誤。

# 錯誤範例
datetime.strptime("2024/05/01", "%Y-%m-%d")
# ValueError: time data '2024/05/01' does not match format '%Y-%m-%d'

對策: 確保格式字串和實際輸入完全一致。

7.3 忘記加上時區

在需要處理跨時區應用時,若未設定 tzinfo,可能會導致時間邏輯錯誤。

對策: 使用 timezoneZoneInfo 加上正確的時區資訊。

7.4 無法直接比較含時區與不含時區的 datetime

# 錯誤範例
dt1 = datetime.now()  # 無時區
dt2 = datetime.now(timezone.utc)  # 有時區
print(dt1 > dt2)
# TypeError: can't compare offset-naive and offset-aware datetimes

對策: 確保比較的 datetime 物件都有統一的時區設定。

8. 總結

本文完整介紹了 Python 的 datetime 模組,從基本的現在時間取得、格式轉換、加減運算、時區處理,到常見錯誤的排解方式。

以下是本文的重點整理:

  • datetime 模組是處理日期與時間的核心工具。
  • strftime() 可將 datetime 轉換成字串,strptime() 則可解析字串為 datetime。
  • 使用 timedelta 可以方便地進行時間加減計算。
  • 時區處理可搭配 timezoneZoneInfo 進行。
  • 注意型別錯誤、格式錯誤,以及含有/不含時區的 datetime 比較問題。

熟悉這些操作後,就能更有效率地在 Python 專案中處理時間相關的需求。不論是日常的自動化腳本,還是跨國服務的時區管理,datetime 模組都能派上用場!