Python で日付が「今月」「今週」「今日」かを判定する

「この日付は今日か?」「今週中か?」「今月か?」といった判定は、フィルタリングや表示切り替えでよく使います。Python での実装方法をパターン別に見ていきましょう。

今日かどうかを判定する

date.today() と比較するのが最もシンプルです。

from datetime import date, datetime

today = date.today()
target_date = date(2025, 1, 15)

if target_date == today:
    print("今日です")
else:
    print("今日ではありません")

datetime オブジェクトの場合は、date() メソッドで日付部分を取り出して比較します。

from datetime import date, datetime

today = date.today()
target_dt = datetime(2025, 1, 15, 14, 30, 0)

if target_dt.date() == today:
    print("今日です")

時刻の違いを無視して日付だけで判定したいときに使うパターンです。

今週かどうかを判定する

「今週」の定義は用途によって異なりますが、月曜始まりの週で判定する例を示します。

from datetime import date, timedelta

def get_week_range(d):
    """指定日を含む週の月曜と日曜を返す"""
    monday = d - timedelta(days=d.weekday())
    sunday = monday + timedelta(days=6)
    return monday, sunday

today = date.today()
monday, sunday = get_week_range(today)

target = date(2025, 1, 15)
if monday <= target <= sunday:
    print("今週です")
else:
    print("今週ではありません")

weekday() は月曜が 0、日曜が 6 を返すため、当日から weekday() 日分を引けば週の月曜日が得られます。

今月かどうかを判定する

年と月が一致するかを確認します。

from datetime import date

today = date.today()
target = date(2025, 1, 15)

if target.year == today.year and target.month == today.month:
    print("今月です")
else:
    print("今月ではありません")

もう少し汎用的に、月の範囲を取得する関数を作ることもできます。

from datetime import date
import calendar

def get_month_range(d):
    """指定日を含む月の初日と末日を返す"""
    first_day = d.replace(day=1)
    last_day_num = calendar.monthrange(d.year, d.month)[1]
    last_day = d.replace(day=last_day_num)
    return first_day, last_day

today = date.today()
first, last = get_month_range(today)
print(f"今月: {first}{last}")

calendar.monthrange() は指定月の日数を返してくれるので、末日の取得に便利です。

判定関数をまとめる

よく使う判定をユーティリティ関数としてまとめておくと再利用しやすくなります。

from datetime import date, timedelta
import calendar

def is_today(d):
    return d == date.today()

def is_this_week(d):
    today = date.today()
    monday = today - timedelta(days=today.weekday())
    sunday = monday + timedelta(days=6)
    return monday <= d <= sunday

def is_this_month(d):
    today = date.today()
    return d.year == today.year and d.month == today.month

# 使用例
target = date(2025, 1, 15)
print(f"今日?: {is_today(target)}")
print(f"今週?: {is_this_week(target)}")
print(f"今月?: {is_this_month(target)}")

日曜始まりにしたい場合

ISO 標準では月曜始まりですが、日曜始まりで週を扱いたい場合もあります。

from datetime import date, timedelta

def get_week_range_sunday_start(d):
    """日曜始まりの週範囲を返す"""
    # weekday(): 月=0, 日=6 なので、日曜始まりなら +1 して 7 で割る
    days_since_sunday = (d.weekday() + 1) % 7
    sunday = d - timedelta(days=days_since_sunday)
    saturday = sunday + timedelta(days=6)
    return sunday, saturday

today = date.today()
sunday, saturday = get_week_range_sunday_start(today)
print(f"今週(日曜始まり): {sunday}{saturday}")

業務要件に合わせて週の開始日を調整してください。