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 |
%M | 分 | 30 |
%S | 秒 | 52 |
%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 是分。下一篇是文字處理的大魔王、也是大殺器:正規表達式。