2010-05-18 24 views
30

Pracuję nad małym trackerem fitness, aby nauczyć się Django. Chcę zobrazować swoją wagę w miarę upływu czasu, dlatego zdecydowałem się użyć opakowania Pythona Google Charts. Wykresy Google wymagają przekształcenia daty w współrzędną x. Aby to zrobić, chcę odjąć liczbę dni w moim zestawie danych odejmując pierwsze ważenie od ostatniego ważenia, a następnie używając tego, aby obliczyć współrzędne x (na przykład, mógłbym uzyskać wynik 100 i zwiększyć x coordin przez wynikową liczbę dla każdego y coord.)Jak odjąć dwie daty w Django/Pythonie?

W każdym razie, muszę wymyślić, jak odjąć od Django obiekty datetime od siebie i jak dotąd, wybijam się zarówno na google, jak i tutaj na stosie. Znam PHP, ale nigdy nie miałem do czynienia z programowaniem OO, więc proszę wybacz mi moją ignorancję. Oto, jak wyglądają moje modele:

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

Jakieś pomysły dotyczące sposobu postępowania w widoku? Dzięki wielkie!

Odpowiedz

54

Można po prostu odejmować daty bezpośrednio, co przyniesie datetime.timedelta obiektu:

dt = weight_now.weight_date - weight_then.weight_date 

timedelta obiekt ma pola dni, sekund i mikrosekund. Stamtąd możesz po prostu wykonać odpowiednią matematykę. Na przykład:

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

Doskonale, dziękuję bardzo. Użyto tego niemal dosłownie. –

31

Django datetime obiekty są po prostu regularne Python datetime objects. Po odjęciu jednego datetime od innego otrzymasz obiekt timedelta.

Jeśli chcesz odjąć czas od wartości datetime, odejmij od niej obiekt timedelta. Na przykład:

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

To jest świetne. Dziękuję bardzo ... Jestem przyzwyczajony do myślenia w ciągach, nie sądziłem, że obiekt może zostać wygenerowany przez odjęcie dwóch innych obiektów. –

3

Należy pamiętać, że odjęcie nie zadziała w przypadku dwa razy mają różne daty offsetu świadomości, na przykład, jeden z tzinfo i jeden bez (native).

+0

to nie jest odpowiedź na pytanie. zostaw komentarz do innej odpowiedzi, jeśli masz coś dodać do tego, co zostało powiedziane – FistOfFury