概要
datetime.datetime.now()を使って日付を計算しようとしたときに意図しない結果になる場合がある。
datetime.datetime(YYYY, mm, dd)とdatetime.datetime.now()を使って日数の差分を取得したい場合
事例
datetime.datetimeオブジェクトは時刻を省略して日付のみで作成することも出来る。
この場合、時間と分は0となる。
datetime.datetime
>>> datetime.datetime(2023, 1, 8)
datetime.datetime(2023, 1, 8, 0, 0) # 時刻には0が入る
datetime.datetime.now()を実行すると、現在の日付と時刻が取得される。
datetime.datetime.now()
>>> datetime.datetime.now()
datetime.datetime(2023, 1, 8, 17, 20, 37, 109800)
この状態で日付同士の差分を求めようとすると、各項の順番によって値が変わる。
日付差分(2023年1月8日に実施)
>>> datetime.datetime(2023, 1, 8) - datetime.datetime.now()
datetime.timedelta(days=-1, seconds=23888, microseconds=735007) # 期待した値はdays=0
>>> datetime.datetime(2023, 1, 9) - datetime.datetime.now()
datetime.timedelta(seconds=23623, microseconds=392751) # 期待した値はdays=1
>>> datetime.datetime.now() - datetime.datetime(2023, 1, 8)
datetime.timedelta(seconds=62520, microseconds=388495) # 期待した値はdays=0
>>> datetime.datetime.now() - datetime.datetime(2023, 1, 9)
datetime.timedelta(days=-1, seconds=62759, microseconds=391388) # 期待した値はdays=-1
datetime.datetime.now()関数は現在時刻を持っているため、datetime.datetime(YYYY, mm, dd)で宣言した値と時刻分の差が出来てしまう。
解決策
datetime.datetime.now()からdateime.datetime(YYYY, mm, dd)を引く。