日付や時刻の値への加算・減算と値の比較

日付や時刻の値に対して日数や分数などを加算したり減算したりした新しいインスタンスを生成することができます。また二つの日付や時刻の値の差を求めたり比較したりすることもできます。ここでは日付や時刻の値の演算と比較の方法について解説します。

(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 )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。