Подтвердить что ты не робот

Как вычесть две даты в Django/Python?

Я работаю над небольшим фитнес-трекером, чтобы научить себя Django. Я хочу, чтобы график моего веса с течением времени, поэтому я решил использовать Python Google Charts Wrapper. Графики Google требуют, чтобы вы преобразовали дату в координату x. Для этого я хочу взять количество дней в моем наборе данных, вычитая первое взвешивание с последнего взвешивания, а затем используя это, чтобы определить х-координаты (например, я мог бы 100 получить результат и увеличить x координата по полученному числу для каждой координаты y.)

В любом случае, мне нужно выяснить, как вычитать объекты datetime Django друг от друга, и до сих пор я удаляюсь как в google, так и в стеке. Я знаю PHP, но никогда не занимался программированием OO, поэтому, пожалуйста, извините мое невежество. Вот как выглядят мои модели:

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()

Любые идеи о том, как действовать в представлении? Большое спасибо!

4b9b3361

Ответ 1

Вы можете просто вычесть даты непосредственно, что даст объект datetime.timedelta:

dt = weight_now.weight_date - weight_then.weight_date
Объект

A timedelta имеет поля для дней, секунд и микросекунд. Оттуда вы можете просто сделать соответствующую математику. Например:

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

Ответ 2

Django datetime объекты просто регулярны объекты Python datetime. Когда вы вычитаете один datetime из другого, вы получаете объект timedelta.

Если вы хотите вычесть время с datetime, вам нужно вычесть из него объект timedelta. Например:

>>> 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

Ответ 3

Обратите внимание, что вычитание не будет работать, если два времени даты имеют различную осведомленность о смещении, например, одну с tzinfo и одну без (native).