Python で2つの日付を比較して大小や期間内かを判定する
datetime オブジェクトは比較演算子で大小関係を判定できます。期限チェックや期間内判定など、実務で頻出するパターンを見ていきましょう。
基本の比較演算
datetime 同士は <、>、== などの演算子で比較できます。
from datetime import datetime
dt1 = datetime(2025, 1, 15, 10, 0, 0)
dt2 = datetime(2025, 1, 20, 10, 0, 0)
print(dt1 < dt2) # True(dt1 のほうが過去)
print(dt1 > dt2) # False
print(dt1 == dt2) # False
print(dt1 != dt2) # True
時系列で前にあるほうが「小さい」と判定されます。直感的に使えるので便利ですね。
現在時刻との比較
期限切れかどうかを判定する例です。
from datetime import datetime
deadline = datetime(2025, 1, 31, 23, 59, 59)
now = datetime.now()
if now > deadline:
print("期限切れです")
else:
print("まだ期限内です")
deadline に期限を設定し、現在時刻と比較するだけでチェックできます。
期間内かを判定する
開始日と終了日の間に含まれるかどうかを判定してみます。
from datetime import datetime
start = datetime(2025, 1, 1)
end = datetime(2025, 1, 31)
target = datetime(2025, 1, 15)
if start <= target <= end:
print("期間内です")
else:
print("期間外です")
Python では start <= target <= end のようにチェーン比較が書けるため、数学的な表記に近い形で範囲判定ができます。
date オブジェクトの比較
日付だけを比較したい場合は date オブジェクトを使います。
from datetime import date
date1 = date(2025, 1, 15)
date2 = date(2025, 1, 20)
print(date1 < date2) # True
datetime の date() メソッドで日付部分だけを取り出して比較することもできます。
from datetime import datetime
dt1 = datetime(2025, 1, 15, 10, 30, 0)
dt2 = datetime(2025, 1, 15, 18, 0, 0)
# datetime 同士は時刻も含めて比較される
print(dt1 == dt2) # False
# 日付部分だけを比較
print(dt1.date() == dt2.date()) # True
「同じ日かどうか」を判定したいときに使えるテクニックです。
タイムゾーンに注意
タイムゾーン情報を持つ datetime(aware)と持たない datetime(naive)は比較できません。
from datetime import datetime, timezone
dt_naive = datetime(2025, 1, 15, 10, 0, 0)
dt_aware = datetime(2025, 1, 15, 10, 0, 0, tzinfo=timezone.utc)
# これはエラーになる
# print(dt_naive < dt_aware) # TypeError
比較する際は、両方とも naive にするか、両方とも aware にするかを統一してください。
from datetime import datetime, timezone
dt1 = datetime(2025, 1, 15, 10, 0, 0, tzinfo=timezone.utc)
dt2 = datetime(2025, 1, 15, 19, 0, 0, tzinfo=timezone(timedelta(hours=9)))
# JST の 19:00 は UTC の 10:00 なので等しい
print(dt1 == dt2) # True
タイムゾーン付きの比較では、内部的に UTC に変換されてから比較が行われます。異なるタイムゾーンでも正しく比較できるのは便利ですが、混在に気をつけましょう。