HOWTO · Python
如何在 Python 中對 datetime 做減法
介紹如何在 Python 中相減日期時間,並將時間差換算為常用單位。
本頁內容
使用 later - earlier 將一個 datetime 物件減去另一個物件。Python 會回傳代表兩者經過時間的 timedelta。你可以讀取其中的天數與秒數,或換算成總秒數、分鐘或小時。
在 Python 中使用 datetime 模組減去日期時間
datetime 模組提供日期與時間物件。建立物件時要指定年、月、日;小時、分鐘、秒與微秒則可選擇提供。以下範例使用固定值,因此結果不會因執行時間不同而改變。
from datetime import datetime
earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier
print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5
結果是兩小時三十分鐘的 timedelta。它的 days、seconds 和 microseconds 屬性會以正規化後的組成部分表示這段時間。若要取得整段經過時間的秒數,請對 timedelta(而非 datetime)呼叫 total_seconds()。將總秒數除以 60 可換算成分鐘,除以 3,600 則可換算成小時。若時間差不是整數分鐘或小時,這些除法會保留小數部分。
days 屬性是整天的部分,seconds 則是正規化後剩餘的秒數;兩者都不能取代整段時間的總秒數。例如,超過一天的時間差,其 seconds 仍可能小於 86,400。若需要涵蓋整段時間的單一秒數總計,請使用 total_seconds()。時間差含有微秒時,回傳值可能是浮點數。
若需要整數單位,請明確選擇取整規則。轉成 int() 會朝零截斷,不會四捨五入到最接近的單位。另外,一年並非固定長度:把 365 天當作一年只是近似值,因為閏年與月份的日曆邊界都會影響日曆計算。如果問題問的是「一年後」這類日期,應採用明確的日曆運算方式,而不是把它當成經過秒數。
只有在兩個值能以一致方式比較時,才適合相減。沒有時區資訊的 naive 值可以彼此相減。若要計算 aware 值跨越時區轉換的經過時間,請先用 astimezone(timezone.utc) 將兩者正規化為 UTC。混用 naive 與 aware 值會引發 TypeError;相減前應審慎指定或轉換時區資訊。