Как вычесть две даты в Django / Python? - PullRequest
34 голосов
/ 19 мая 2010

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

В любом случае, мне нужно выяснить, как вычесть объекты даты и времени Django друг из друга, и пока я вычеркиваю как в Google, так и здесь, в стеке. Я знаю PHP, но никогда не разбирался в ОО-программировании, поэтому прошу прощения за мое незнание. Вот как выглядят мои модели:

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

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

Ответы [ 3 ]

59 голосов
/ 19 мая 2010

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

dt = weight_now.weight_date - weight_then.weight_date

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

hours = dt.seconds / 60 / 60    # Returns number of hours between dates
weeks = dt.days / 7             # number of weeks between dates
33 голосов
/ 19 мая 2010

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
4 голосов
/ 21 мая 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...