Una delle principali differenze non evidenziate in altre risposte è la presenza di sostantivi singolari e plurali per ogni primitiva di differenza di tempo. Mentre timedelta
solo le offerte plurale nomi (ad esempio hours
, days
) per denotare relativa differenza di tempo, relativedelta
offerte sostantivi singolari pure (ad esempio hour
, day
) per indicare informazioni di tempo assoluto.
Questo risulta chiaro dalla definizione delle 2 classi:
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)
Ora, cosa fa esattamente la forma singolare? La forma singolare crea un delta che, quando aggiunto a un datetime
oggetto, imposta quella primitiva data / ora specifica datetime
nell'oggetto a quella menzionata nel file relativedelta
. Ecco un piccolo esempio:
>>> 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)
Questo può portare ad relativedelta
essere utilizzato per alcune applicazioni interessanti, che possono essere complicate da implementare utilizzando timedelta
. Uno che viene subito in mente è l'arrotondamento.
Un'applicazione interessante: arrotondamento rapido
Ora ti mostrerò come relativedelta
è più espressivo quando si arrotonda un datetime
oggetto al minuto, all'ora, al giorno più vicini, ecc.
Arrotondare all'ora più vicina:
Nota quanto è semplice arrotondare usando 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)
Altri arrotondamenti più complicati sono facilmente realizzabili utilizzando relativedelta
. Tuttavia, si noti che tutti gli arrotondamenti che possono essere eseguiti relativedelta
possono essere eseguiti anche utilizzando le datetime
funzioni e timedelta
, solo in un modo leggermente più complesso.
dateime.timedelta
che otterrà ciò che desideri ed eviterà la dipendenza daldateutil
pacchetto esterno .