Python datetime 日期時間

Python datetime(Python Datetime)

這篇 Python datetime 教學將帶你處理日期與時間:取得現在時刻、格式化顯示、解析字串、計算相隔天數、處理時區。範例輸出以執行當下為準,你跑出來的日期會不同。

取得現在時間與建立日期

from datetime import datetime, date

now = datetime.now()
print(now)
print(now.year, now.month, now.day)
print(now.hour, now.minute)

# 建立指定日期
deadline = datetime(2026, 12, 31, 23, 59)
print(deadline)
print(date.today())     # 只要日期不要時間

執行輸出(依執行時間而異):

2026-06-05 14:30:52.123456
2026 6 5
14 30
2026-12-31 23:59:00
2026-06-05

strftime:日期 → 字串

格式代碼速查(大小寫意義不同,特別注意 %m 月 vs %M 分):

代碼意義範例
%Y西元年(4 位)2026
%m月(補零)06
%d日(補零)05
%H時(24 小時制)14
%M30
%S52
%A星期幾(英文)Friday
from datetime import datetime

now = datetime(2026, 6, 5, 14, 30)

print(now.strftime("%Y-%m-%d"))
print(now.strftime("%Y年%m月%d日 %H:%M"))
print(now.strftime("%Y/%m/%d (%A)"))

執行輸出:

2026-06-05
2026年06月05日 14:30
2026/06/05 (Friday)

strptime:字串 → 日期

解析字串成 datetime,格式必須跟字串完全對上

from datetime import datetime

d = datetime.strptime("2026-06-05", "%Y-%m-%d")
print(d)

d2 = datetime.strptime("05/06/2026 14:30", "%d/%m/%Y %H:%M")
print(d2)

執行輸出:

2026-06-05 00:00:00
2026-06-05 14:30:00

記法:strftime 的 f 是 format(輸出格式)、strptime 的 p 是 parse(解析)。

timedelta:日期計算

日期的加減用 timedelta,兩個日期相減也得到 timedelta:

from datetime import datetime, timedelta

today = datetime(2026, 6, 5)

print(today + timedelta(days=30))      # 30 天後
print(today - timedelta(weeks=2))      # 兩週前

deadline = datetime(2026, 12, 31)
remaining = deadline - today
print(f"距離年底還有 {remaining.days} 天")

執行輸出:

2026-07-05 00:00:00
2026-05-22 00:00:00
距離年底還有 209 天

台灣時區:ZoneInfo

伺服器常設 UTC 時區,跟台灣差 8 小時。標準做法用內建的 zoneinfo

from datetime import datetime
from zoneinfo import ZoneInfo

taipei = datetime.now(ZoneInfo("Asia/Taipei"))
utc = datetime.now(ZoneInfo("UTC"))

print(taipei.strftime("%Y-%m-%d %H:%M %Z"))
print(utc.strftime("%Y-%m-%d %H:%M %Z"))

執行輸出(依執行時間而異):

2026-06-05 14:30 CST
2026-06-05 06:30 UTC

帶時區的 datetime 稱為 aware、不帶的稱為 naive,兩者不能混算

常見錯誤

1. ValueError: time data … does not match format

strptime 的格式跟字串對不上:分隔符不同(- vs /)、少了時間部分、或 %m%M 用錯。逐字元核對格式字串。

2. TypeError: can’t subtract offset-naive and offset-aware datetimes

帶時區與不帶時區的 datetime 相減。統一陣營:要嘛全部加 ZoneInfo,要嘛全部不加。

3. 用字串比較日期

"2026/6/5" > "2026/12/1" 按字典序比是 True(錯的)。日期比較一律先轉成 datetime 物件再比。

總結

datetime.now() 取現在、strftime 輸出(f=format)、strptime 解析(p=parse)、timedelta 加減天數、ZoneInfo("Asia/Taipei") 處理時區;記住 %m 是月、%M 是分。下一篇是文字處理的大魔王、也是大殺器:正規表達式。

延伸閱讀