Une différence majeure non soulignée dans les autres réponses est la présence de noms singuliers et pluriels pour chaque primitive de différence de temps. Bien timedelta
que n'offre que des noms au pluriel (par exemple hours
, days
) pour désigner une différence de temps relative, relativedelta
offre également des noms au singulier (par exemple hour
, day
) pour désigner des informations de temps absolues.
Cela ressort clairement de la définition des 2 classes:
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)
Maintenant, que fait exactement la forme singulière? La forme singulière crée un delta qui, lorsqu'il est ajouté à un datetime
objet, définit cette primitive de date / heure spécifique dans l' datetime
objet sur celle mentionnée dans le relativedelta
. Voici un petit exemple:
>>> 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)
Cela peut conduire à relativedelta
être utilisé pour certaines applications intéressantes, qui peuvent être compliquées à mettre en œuvre timedelta
. Une solution qui me vient rapidement à l'esprit est l'arrondissement.
Une application intéressante: arrondir rapidement
Je vais maintenant vous montrer comment il relativedelta
est plus expressif d'arrondir un datetime
objet à la minute, à l'heure, au jour, etc.
Arrondir à l'heure la plus proche:
Remarquez à quel point il est simple d'arrondir en utilisant 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)
D'autres arrondis plus compliqués sont facilement réalisables en utilisant relativedelta
. Cependant, notez que tous les arrondis qui peuvent être effectués par relativedelta
peuvent également être effectués à l'aide de datetime
fonctions et timedelta
, seulement de manière légèrement plus alambiquée.
dateime.timedelta
qui permettra d'obtenir ce que vous voulez et d'éviter la dépendance audateutil
paquet externe .