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
注意:格式字串必須和輸入的字串格式完全一致,否則會發生錯誤。
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
外,也支援 hours
、minutes
、seconds
等單位:
# 加上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)。
若需要更完整的時區支援(例如美國的夏令時間轉換),建議使用第三方套件 pytz
或 zoneinfo
(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)
datetime
和 str
是不同的資料型別,不能直接相加或比較。
# 錯誤範例
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
,可能會導致時間邏輯錯誤。
對策: 使用 timezone
或 ZoneInfo
加上正確的時區資訊。
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
可以方便地進行時間加減計算。 - 時區處理可搭配
timezone
或ZoneInfo
進行。 - 注意型別錯誤、格式錯誤,以及含有/不含時區的 datetime 比較問題。
熟悉這些操作後,就能更有效率地在 Python 專案中處理時間相關的需求。不論是日常的自動化腳本,還是跨國服務的時區管理,datetime
模組都能派上用場!