專項練習 · 9 分鐘閱讀

Python datetime 練習:日期、時間差與格式化

日期看起來簡單,直到月份長度、閏年和時區出現。datetime 模組會替你處理日曆規則。真正的關鍵是選對物件:日期、時長,還是某個具體瞬間。

建立並查看日期

date 會驗證年、月、日。isoformat 生成穩定、可排序的 YYYY-MM-DD 字串。需要分別使用年月日時,存取 year、month 和 day 屬性。

from datetime import date
start = date(2026, 1, 15)
print(start.isoformat())
print(start.year, start.month, start.day)

經過驗證的日曆日期

加上一段時長

timedelta 儲存的是一段時長,不是日期。把它加到日期上會回傳新日期,並正確處理跨月和跨年。兩個日期相減得到 timedelta,days 屬性給出相差天數。

from datetime import date, timedelta
start = date(2026, 1, 30)
end = start + timedelta(days=3)
print(end.isoformat())
print((end - start).days)

日期運算

用穩定的模式格式化

strftime 把日期變成文字。%Y/%m/%d 這類數字模式在不同區域設定下都可預測。月份名和星期名會隨機器語言變化,不要把它們放進儲存資料。

from datetime import date
day = date(2026, 10, 27)
print(day.strftime("%Y/%m/%d"))
print(day.isoformat())

數字格式化

區分日期與瞬間

date 回答的是哪一天,帶時區的 datetime 回答的是哪一個瞬間。當值表示不同地區共同觀察的時刻時,才添加 tzinfo。不要為了讓日期看起來完整而硬塞一個時區。

from datetime import datetime, timezone
moment = datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc)
print(moment.isoformat())

帶時區的瞬間

格式明確時才解析文字

strptime 按顯式模式把文字變成 datetime。把同一個模式集中放在一處,寫入和讀取就不會悄悄漂移。面對使用者輸入的日期,要處理解析錯誤,不要假設文字一定合法。

from datetime import datetime
day = datetime.strptime("2026-10-27", "%Y-%m-%d")
print(day.date().isoformat())

從文字回到日期

你的練習清單

常見問題

timedelta 會處理閏年嗎?

會。給日期加天數會遵循日曆規則,包括閏年。

date 和 datetime 有什麼區別?

date 只有年月日。datetime 還包含時間,也可以攜帶時區資訊。

為什麼換一臺電腦後 strftime 的月份名變了?

月份名和星期名依賴區域設定。數字模式可以避免這種差異。

練習日期

12 道題,覆蓋日期建立、timedelta、日期差、格式化和帶時區的值。

打開練習

繼續閱讀: