web-dev-qa-db-fra.com

Comment soustraire deux dates dans Django / Python?

Je travaille sur un petit tracker de fitness pour m'enseigner Django. Je veux représenter graphiquement mon poids au fil du temps, j'ai donc décidé d'utiliser le Python Google Charts Wrapper. Les graphiques Google nécessitent que vous convertissiez votre date en coordonnées de hache. Pour ce faire, je veux prendre le nombre de jours dans mon jeu de données en soustrayant la première pesée de la dernière pesée et en l'utilisant ensuite pour déterminer les x cordes (par exemple, je pourrais 100 par le résultat et incrémenter la coordonnée x par le nombre résultant pour chaque coordonnée y)

Quoi qu'il en soit, je dois comprendre comment soustraire Django objets datetime les uns des autres et jusqu'à présent, je suis rayé à la fois sur google et ici sur la pile. Je connais PHP, mais je n'ai jamais obtenu une poignée sur la programmation OO, alors veuillez excuser mon ignorance. Voici à quoi ressemblent mes modèles:

class Goal(models.Model):
    goal_weight = models.DecimalField("Goal Weight", 
        max_digits=4, 
        decimal_places=1)
    target_date = models.DateTimeField("Target Date to Reach Goal")
    set_date = models.DateTimeField("When did you set your goal?")
    comments = models.TextField(blank=True)

    def __unicode__(self):
        return unicode(self.goal_weight)

class Weight(models.Model):
    """ Weight at a given date and time. """

    goal = models.ForeignKey(Goal)
    weight = models.DecimalField("Current Weight",
        max_digits=4, 
        decimal_places=1)
    weigh_date = models.DateTimeField("Date of Weigh-In")
    comments = models.TextField(blank=True)

    def __unicode__(self):
        return unicode(self.weight)

    def recorded_today(self):
        return self.date.date() == datetime.date.today()

Des idées sur la façon de procéder dans la vue? Merci beaucoup!

35
biased_estimator

Vous pouvez simplement soustraire directement les dates, ce qui donnera un datetime.timedelta objet:

dt = weight_now.weight_date - weight_then.weight_date

Un objet timedelta possède des champs pour les jours, les secondes et les microsecondes. De là, vous pouvez simplement faire les calculs appropriés. Par exemple:

hours = dt.seconds / 60 / 60    # Returns number of hours between dates
weeks = dt.days / 7             # number of weeks between dates
60
mipadi

Les objets Django datetime sont juste normaux objets Python datetime . Lorsque vous soustrayez un datetime d'un autre, vous obtenez un objet timedelta .

Si vous cherchez à soustraire une durée d'un datetime, vous devez lui soustraire un timedelta objet. Par exemple:

>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> print now
2010-05-18 23:16:24.770533
>>> this_time_yesterday = now - timedelta(hours=24)
>>> print this_time_yesterday
2010-05-17 23:16:24.770533
>>> (now - this_time_yesterday).days
1
33
Dan Head

Notez que la soustraction ne fonctionnera pas si les deux heures de date ont une détection de décalage différente, par exemple, une avec tzinfo et une sans (native).

4
Itkovian