他の回答で強調されていない1つの大きな違いは、各時差プリミティブに単数形と複数形の名詞が存在することです。一方timedelta
のみオファー複数名詞(例えばhours
、days
相対時間差を意味する)、relativedelta
オファー単数名詞をも(例えばhour
、day
絶対時間情報を意味します)。
これは、2つのクラスの定義から明らかです。
Definition: datetime.timedelta([days[, seconds[, microseconds[,
milliseconds[, minutes[, hours[, weeks]]]]]]])
Definition: relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)
さて、単数形は正確に何をしますか?特異形式は、datetime
オブジェクトに追加されると、オブジェクト内の特定の日付/時刻プリミティブをに記載されているものに設定するデルタを作成しdatetime
ますrelativedelta
。ここに小さな例があります:
>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1)
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1)
datetime.datetime(2018, 11, 17, 1, 6, 31)
これはrelativedelta
、を使用して実装するのが複雑になる可能性があるいくつかの興味深いアプリケーションに使用される可能性がありますtimedelta
。すぐに頭に浮かぶのは四捨五入です。
興味深いアプリケーション:すばやく丸める
ここでrelativedelta
、datetime
オブジェクトを最も近い分、時間、日などに丸めるときに、より表現力が高いことを示します。
最も近い時間への四捨五入:
以下を使用して四捨五入するのがいかに簡単であるかに注意してrelativedelta
ください。
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)
その他のより複雑な四捨五入は、を使用して簡単に実現できrelativedelta
ます。ただし、で実行できるすべての丸めは、関数とrelativedelta
を使用して実行することもできますが、少し複雑な方法でのみ実行できることに注意してください。datetime
timedelta
dateime.timedelta
を達成し、外部dateutil
パッケージへの依存を回避できます。