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

datetimedate() メソッドで日付部分だけを取り出して比較することもできます。

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 に変換されてから比較が行われます。異なるタイムゾーンでも正しく比較できるのは便利ですが、混在に気をつけましょう。