Одно из основных различий, не освещенное в других ответах, - это наличие существительных в единственном и множественном числе для каждого примитива разницы во времени. Хотя timedelta
предлагает только существительные во множественном числе (например hours
, days
) для обозначения относительной разницы во времени, relativedelta
предлагает также существительные в единственном числе (например hour
, day
) для обозначения информации об абсолютном времени.
Это ясно из определения двух классов:
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)
Итак, что именно делает форма единственного числа? Форма Singular создает дельту, которая при добавлении к 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
пакета.