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

広告

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

日付や時刻に対する演算

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 日だけ過去の日付になっています。

サンプルプログラム

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample8-1.py という名前で保存します。

import datetime

d1 = datetime.date(1999, 12, 1)
print(d1)
print(d1 + datetime.timedelta(days=31))
print(d1 + datetime.timedelta(days=-2))

その後で、次のように実行してください。

python sample8-1.py

日付や時刻に対する演算(1)

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

サンプルプログラム

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample8-2.py という名前で保存します。

import datetime

d1 = datetime.date(2020, 7, 21)
d2 = datetime.date(2020, 5, 12)
print(d1)
print(d2)

td = d1 - d2
print(td)
print(td.days)

その後で、次のように実行してください。

python sample8-2.py

日付と日付の差を求める(1)

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

サンプルプログラム

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample8-3.py という名前で保存します。

import datetime

d1 = datetime.date(2020, 7, 21)
d2 = datetime.date(2020, 5, 12)
print(d1)
print(d2)

print(d1 > d2)

t1 = datetime.time(6, 12, 30, 551)
t2 = datetime.time(8, 4, 17, 32814)
print(t1)
print(t2)

print(t1 > t2)

その後で、次のように実行してください。

python sample8-3.py

日付と日付を比較する(1)

2 つの date クラスのインスタンスを比較し、そのあとで 2 つの time クラスのインスタンスを比較しました。

-- --

日付や時刻の値の演算と比較の方法について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。