日付や時刻の値への加算・減算と値の比較
日付や時刻の値に対して日数や分数などを加算したり減算したりした新しいインスタンスを生成することができます。また二つの日付や時刻の値の差を求めたり比較したりすることもできます。ここでは日付や時刻の値の演算と比較の方法について解説します。
(Last modified: )
日付や時刻に対する演算
datetime クラスのインスタンスや date クラスのインスタンスに対して、時刻差を表す timedelta クラスのインスタンスを加算や減算して新しいインスタンスを生成することができます。イメージ的には次のようになります。
dt2 = dt1 + td dt2 = dt1 - td
medelta クラスは時刻差の値を扱うクラスです。コンストラクタは次のようになっています。
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
引数には、時刻差をあらわす日(days)、秒(senconds)、マイクロ秒(microseconds)、ミリ秒(milliseconds)、分(minutes)、時(hours)、週(weeks)の値を指定します。
例えば 1 日を加算する場合、具体的には次のように記述します。
import datetime dt1 = datetime.datetime(2020, 7, 21, 6, 12, 30, 551) print(dt1) >> 2020-07-21 06:12:30.000551 dt2 = dt1 + datetime.timedelta(days=1) print(dt2) >> 2020-07-22 06:12:30.000551 dt3 = dt1 + datetime.timedelta(days=-1) print(dt3) >> 2020-07-20 06:12:30.000551
元の日付の値と比べて 1 日だけ未来の日付および 1 日だけ過去の日付になっています。
次のサンプルを見てください。
import datetime d1 = datetime.date(1999, 12, 1) print(d1) >> 1999-12-01 print(d1 + datetime.timedelta(days=31)) >> 2000-01-01 print(d1 + datetime.timedelta(days=-2)) >> 1999-11-29
date クラスのインスタンスに対して 31 日を加算した場合と、 2 日を減算した場合でそれぞれ新しいインスタンスを作成しました。
日付と日付の差を求める
2 つの datetime クラスのインスタンスに対して、どれだけ日時や時刻の差があるのかを求めることができます( date クラスのインスタンスでも同じように行えます)。結果は時刻差を表す timedelta クラスのインスタンスとして取得します。イメージ的には次のようになります。
td = dt1 - dt2
具体的には次のように記述します。
import datetime dt1 = datetime.datetime(2020, 7, 21, 6, 12, 30, 551) print(dt1) >> 2020-07-21 06:12:30.000551 dt2 = datetime.datetime(2020, 5, 12, 6, 45, 12, 7721) print(dt2) >> 2020-05-12 06:45:12.007721 print(dt1 - dt2) >> 69 days, 23:27:17.992830
なお timedelta クラスではインスタンス毎に次の属性を参照することができます。
timedelta.days : 日 -999999999 から 999999999 timedelta.seconds : 秒 0 から 86399 timedelta.microseconds : マイクロ秒 0 から 999999
属性値を参照することで、差を数値として取得することができます。
具体的には次のように記述します。
import datetime dt1 = datetime.datetime(2020, 7, 21, 6, 12, 30, 551) print(dt1) >> 2020-07-21 06:12:30.000551 dt2 = datetime.datetime(2020, 5, 12, 6, 45, 12, 7721) print(dt2) >> 2020-05-12 06:45:12.007721 td1 = dt1 - dt2 print(td1) >> 69 days, 23:27:17.992830 print(td1.days) >> 69 print(td1.seconds) >> 84437 print(td1.microseconds) >> 992830 td2 = dt2 - dt1 print(td2) >> -70 days, 0:32:42.007170 print(td2.days) >> -70 print(td2.seconds) >> 1962 print(td2.microseconds) >> 7170
次のサンプルを見てください。
import datetime d1 = datetime.date(2020, 7, 21) d2 = datetime.date(2020, 5, 12) print(d1) >> 2020-07-21 print(d2) >> 2020-05-12 td = d1 - d2 print(td) >> 70 days, 0:00:00 print(td.days) >> 70
2 つの date クラスのインスタンスの差を求めました。
日付と日付を比較する
2 つの datetime クラスのインスタンスを比較して、どちらが未来の日付なのか調べることができます。結果はブール値( True or False )で取得します。イメージ的には次のようになります。
dt1 > dt2
dt1 のほうが dt2 よりも未来の日付だった場合には True を返します。
具体的には次のように記述します。
import datetime dt1 = datetime.datetime(2020, 7, 21, 6, 12, 30, 551) print(dt1) >> 2020-07-21 06:12:30.000551 dt2 = datetime.datetime(2020, 5, 12, 6, 45, 12, 7721) print(dt2) >> 2020-05-12 06:45:12.007721 print(dt1 > dt2) >> True
なお値の比較に関しては datetime クラスと date クラスに加えて time クラスでもインスタンス同士の値の比較が行えます。ただしタイムゾーンの情報を持つ time クラスのインスタンスとタイムゾーンの情報を持たない time クラスのインスタンスを比較すると TypeError が発生します。
import datetime t1 = datetime.time(6, 12, 30, 551) print(t1) >> 06:12:30.000551 tokyo_tz = datetime.timezone(datetime.timedelta(hours=9)) t2 = datetime.time(8, 4, 17, 32814, tokyo_tz) print(t2) >> 08:04:17.032814+09:00 print(t1 > t2) >> TypeError: can't compare offset-naive and offset-aware times
次のサンプルを見てください。
import datetime d1 = datetime.date(2020, 7, 21) d2 = datetime.date(2020, 5, 12) print(d1) >> 2020-07-21 print(d2) >> 2020-05-12 print(d1 > d2) >> True t1 = datetime.time(6, 12, 30, 551) t2 = datetime.time(8, 4, 17, 32814) print(t1) >> 06:12:30.000551 print(t2) >> 08:04:17.032814 print(t1 > t2) >> False
2 つの date クラスのインスタンスを比較し、そのあとで 2 つの time クラスのインスタンスを比較しました。
-- --
日付や時刻の値の演算と比較の方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。