2016-05-23 2 views
1

Extrait de la description de dateutil.relativedelta.relativedelta,Quelles sont les différences entre l'argument singulier et pluriel dans 'dateutil.relativedelta.relativedelta'?

année, mois, jour, heure, minute, seconde, microsecondes:

Absolute information (argument is singular); adding or subtracting a 
relativedelta with absolute information does not perform an aritmetic 
operation, but rather REPLACES the corresponding value in the 
original datetime with the value(s) in relativedelta. 

années, mois, semaines, jours, heures, minutes, secondes, microsecondes:

Relative information, may be negative (argument is plural); adding 
or subtracting a relativedelta with relative information performs 
the corresponding aritmetic operation on the original datetime value 
with the information in the relativedelta. 

Je peux voir les différences par rapport à l'exemple suivant quand il s'agit d'ajouter et soustrayez ing.

>>> from datetime import datetime 
>>> from dateutil.relativedelta import relativedelta 
>>> now = datetime.now() 
>>> str(now) 
'2016-05-23 22:32:48.427269' 
>>> singular = relativedelta(month=3) 
>>> plural = relativedelta(months=3) 

# subtracting 
>>> str(now - singular)    # replace the corresponding value in the original datetime with the value(s) in relativedelta 
'2016-03-23 22:32:48.427269' 
>>> str(now - plural)    # perform the corresponding aritmetic operation on the original datetime value with the information in the relativedelta. 
'2016-02-23 22:32:48.427269' 

# adding 
>>> str(now + singular)    # replace the corresponding value in the original datetime with the value(s) in relativedelta 
'2016-03-23 22:32:48.427269' 
>>> str(now + plural)    # perform the corresponding aritmetic operation on the original datetime value with the information in the relativedelta. 
'2016-08-23 22:32:48.427269' 

A côté de cela, quelles sont les autres différences entre l'argument singulier et pluriel dans relativedelta?

+1

Qu'entendez-vous par «autres différences»?Vous semblez avoir capturé la différence globale assez efficacement. – Paul

+0

@ Paul, je veux juste m'assurer que je comprends bien les différences de sorte que je ne ferai pas d'erreurs dans le futur. – SparkAndShine

Répondre

1

arguments Singular sont des informations absolues, essentiellement, vous pouvez penser à relativedelta(month=3) pour signifier « le mois de Mars, par rapport à ce que la date et l'heure est appliquée » (à savoir remplacer le mot-clé month). Ce n'est pas prête à des opérations telles que la multiplication et la division, de sorte que ces opérations n'a pas d'effet sur l'information absolue:

>>> relativedelta.relativedelta(month=3) * 3 
relativedelta(month=3) 

arguments pluriels sont relatifs des compensations, ils disent: « donnez-moi ce plusieurs mois après/avant la date". Étant donné que ceux-ci sont un décalage, ils se prêtent à la multiplication et la division:

>>> relativedelta.relativedelta(months=3) * 3 
relativedelta(months=9) 

Un bon exemple de cela est utilisé serait dans la classe tzrange, qui utilise relativedelta pour imiter le comportement des chaînes TZ style POSIX. Vous pouvez voir this test, qui utilise l'objet suivant:

tz.tzrange('EST', -18000, 'EDT', -14400, 
     start=relativedelta(hours=+2, month=4, day=1, weekday=SU(+1)), 
     end=relativedelta(hours=+1, month=10, day=31, weekday=SU(-1))) 

Ceci construit un fuseau horaire équivalent à 'EST5EDT', où le start relativedelta est ajouté à une date dans une année donnée pour trouver le début de l'heure d'été pour cette année, et end est ajouté à n'importe quelle date dans une année donnée pour trouver la fin de l'heure d'été pour cette année.

Décomposant:

  • month vous donne une date en Avril
  • day commence à vous lors de la première du mois
  • weekday=SU(+1) vous donne le premier dimanche ou après la date indiquée (ceci est appliqué après les paramètres month et day, donc quand le day est mis à 1, vous obtenez le premier dimanche du mois).
  • hours=+2 - cela vous donnera 2 heures après que toutes les autres choses ont été appliquées. Probablement dans ce cas hour=2 a plus de sens pour démontrer le concept, cependant, puisque où ces relativedelta s est effectivement utilisé, je pense que la première portion de temps est supprimée (donnant une date à minuit), donc c'est vraiment essayer d'encoder 2AM.