カテゴリ: Python 更新日: 2026/01/07

Pythonで日付の比較をする方法(datetimeオブジェクトの比較演算)

Pythonで日付の比較をする方法(datetimeオブジェクトの比較演算)
Pythonで日付の比較をする方法(datetimeオブジェクトの比較演算)

先生と生徒の会話形式で理解しよう

生徒

「今日と明日を比べてどちらが前か後かを判定したいです。Pythonで日付の比較ってどうやるんですか?」

先生

「Pythonではdatetimeモジュールのdatedatetimeオブジェクトをそのまま比較できます。比較演算子を使えば直感的に書けますよ。」

生徒

「具体的なコードで見せてください。初心者でも分かるようにお願いします。」

先生

「では順番に、基本から注意点まで分かりやすく説明します。」

1. 基本:datetimeオブジェクト同士は直接比較できる

1. 基本:datetimeオブジェクト同士は直接比較できる
1. 基本:datetimeオブジェクト同士は直接比較できる

Pythonのdatetimeモジュールで作ったdatedatetimeオブジェクトは、大小比較や等価比較(<>==など)が直接使えます。これは「年・月・日・時・分・秒」を内部で順番に比較しているためで、人がカレンダーで比較するのと同じ感覚で扱えます。


from datetime import date, datetime

d1 = date(2025, 1, 15)
d2 = date(2025, 1, 20)

print(d1 < d2)   # True
print(d1 == d2)  # False

dt1 = datetime(2025,1,15,10,0,0)
dt2 = datetime(2025,1,15,12,0,0)

print(dt1 < dt2) # True

2. date と datetime を比較する場合の注意

2. date と datetime を比較する場合の注意
2. date と datetime を比較する場合の注意

dateオブジェクトとdatetimeオブジェクトは直接比較できません。片方をもう片方の型に揃える必要があります。たとえばdatetime.date()で日付部分だけ取り出して比較するのが一般的です。


from datetime import date, datetime

d = date(2025,1,15)
dt = datetime(2025,1,15, 9, 0, 0)

# d < dt   <-- これはエラーになる
print(d < dt.date())  # False(同じ日付)

3. 範囲チェック(ある期間内かどうか)

3. 範囲チェック(ある期間内かどうか)
3. 範囲チェック(ある期間内かどうか)

開始日と終了日の間にあるかを判定したいときは、比較演算子を組み合わせます。start <= target <= end のように書くと読みやすく、カレンダー範囲のチェックや予約システムでよく使います。


from datetime import date

start = date(2025,1,1)
end = date(2025,1,31)
target = date(2025,1,15)

if start <= target <= end:
    print("対象日は範囲内です")

4. 期間の差を計算して比較する(timedelta)

4. 期間の差を計算して比較する(timedelta)
4. 期間の差を計算して比較する(timedelta)

二つの日付の差を求めると、timedeltaオブジェクトが返ります。差の.daysを使えば日数で比較できます。たとえば締め切りまであと何日かを計算する用途に便利です。


from datetime import date

today = date.today()
deadline = date(2025,2,1)

remaining = (deadline - today).days
print(f"締め切りまであと{remaining}日")

5. タイムゾーン付き datetime の比較(注意点)

5. タイムゾーン付き datetime の比較(注意点)
5. タイムゾーン付き datetime の比較(注意点)

タイムゾーン情報(awareなdatetime)を持つオブジェクト同士は比較可能ですが、片方がタイムゾーン無し(naive)だとエラーになります。実運用では UTC に揃えて比較したり、astimezone()で同じタイムゾーンに変換してから比較するのが安全です。


from datetime import datetime, timezone
from zoneinfo import ZoneInfo

dt_utc = datetime.now(timezone.utc)
dt_jp = datetime.now(ZoneInfo("Asia/Tokyo"))

# 同じタイムライン上で比較するには、同じ timezone に揃える
print(dt_jp.astimezone(timezone.utc) > dt_utc)

6. 実務でよくある間違いと対策

6. 実務でよくある間違いと対策
6. 実務でよくある間違いと対策

代表的なミスは「date と datetime をそのまま比較してエラーになる」「naive と aware を混在させて比較エラーになる」「文字列の日付を直接比較して誤判定する」です。対策としては、

  • 比較前に型を揃える(.date().replace(tzinfo=...)を活用)
  • 日時の保存は UTC に統一し表示時に変換する
  • 文字列を比較する前にstrptimeで必ずdatetimeにパースする

7. 文字列を日付に変換して比較する例

7. 文字列を日付に変換して比較する例
7. 文字列を日付に変換して比較する例

外部入力(フォームやCSV)から来る日付は文字列なので、datetime.strptime()datetimeにしてから比較します。これで「見た目は同じでも型が違って比較できない」という問題を防げます。


from datetime import datetime

s1 = "2025-01-15 10:00:00"
s2 = "2025-01-15 12:00:00"

dt1 = datetime.strptime(s1, "%Y-%m-%d %H:%M:%S")
dt2 = datetime.strptime(s2, "%Y-%m-%d %H:%M:%S")

print(dt1 < dt2)  # True

8. まとめに代わる最後の一言(実践アドバイス)

8. まとめに代わる最後の一言(実践アドバイス)
8. まとめに代わる最後の一言(実践アドバイス)

日付比較はプログラムで頻繁に行う基本操作です。型を揃えること、タイムゾーンに注意すること、文字列は必ずパースすることを守れば安定して扱えます。まずは簡単な比較から始めて、少しずつタイムゾーンや期間計算に慣れていきましょう。

カテゴリの一覧へ
新着記事
New1
Flask
Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説!初心者でもわかるステップ解説
New2
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
New3
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
New4
Flask
FlaskのURLルールとは?ルーティングの基本と動的URLの作り方を解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.3
Java&Spring記事人気No3
Python
Pythonでリストの要素を検索・取得する方法!index()やin演算子の活用法
No.4
Java&Spring記事人気No4
Python
Pythonプログラムの書き方を基礎から学ぼう!初心者が覚えるべき文法とは?
No.5
Java&Spring記事人気No5
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.6
Java&Spring記事人気No6
Python
Pythonのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.8
Java&Spring記事人気No8
Flask
Flaskでクラウド上のメッセージキュー(SQS/PubSub)を扱う完全ガイド!初心者向け解説