Zeiten subtrahieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

ich habe folgenden Code:

Code: Alles auswählen

    stoptime = Time.objects.all().order_by('endtime')
    for coloumn in stoptime:
        stoptime = Time.objects.get(endtime=coloumn.endtime)
        stoptime.endtime = datetime.now()
        stoptime.save()

    starttime = Time.objects.all().order_by('starttime')
    for coloumn in starttime:
        starttime = Time.objects.get(endtime=coloumn.endtime)
    print datetime.date(starttime) - datetime.date(stoptime) 

Leider kommt folgende Fehlermeldung:
descriptor 'date' requires a 'datetime.datetime' object but received a 'Time'

Kann mir jemand sagen wie man die 2 Zeiten richtig voneinander subtrahiert.

vielen Dank
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Übersetze dir mal die Fehlermeldung, die ist wirklich sehr eindeutig.
Das Leben ist wie ein Tennisball.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

das weiß ich, dass die Fehlermeldung sehr eindeutig ist.
Aber wie mache ich es richtig?
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

niemand eine Idee?
BlackJack

Ich habe mir den Code mal inhaltlich angeschaut:

Als erstes: Was bedeutet `coloumn`? Ich vermute mal das ist ein Tippfehler und sollte `column` heissen, das macht aber nicht wirklich Sinn. Das ist doch keine Spalte sondern ein `Time`-Exemplar. Warum heisst das dann nicht `time`? Und warum werden die Namen `stoptime` und `starttime` jeweils in der selben Schleife sowohl für *alle* `Time`-Objekte als auch für einzelne `Time`-Objekte verwendet? Das ist extrem verwirrend. Überhaupt ist eine Bezeichnung im Singular für eine *Sequenz* von Werten unpassend.

Dann habe ich ein Verständnisproblem bei der ersten Schleife. Es wird über *alle* `Time`-Objekte aus der Datenbank iteriert. Wozu werden die dann *in* der Schleife noch mal alle mit `get()` *noch mal* ermittelt? Und funktioniert das überhaupt? Denn bei `get()` muss es ja zu jeder Zeit *genau* *einen* passenden Treffer geben. Und das müsste dann ja das Objekt *selbst* sein. Und damit ergeben alle `get()`-Aufrufe zusammen wieder alle `Time`-Objekte — die hast Du doch aber schon von der Schleife einmal alle abgefragt. Die erste Schleife sollte damit (fast) das gleiche machen wie diese einfachere hier:

Code: Alles auswählen

    now = datetime.now()
    for time in Time.objects.all().order_by('endtime'):
        stoptime.endtime = now
        stoptime.save()
Bei der zweiten Schleife fragt man sich wieder warum das überhaupt eine Schleife ist, denn die durchläuft *alle* `Time`-Objekte aus der Datenbank nur im mit dem *letzten* dann tatsächlich etwas zu machen. Da würde man ja eher einfach nur das letzte Objekt von der Datenbank abfragen statt alle. `QuerySet.latest()` wäre da die passende Methode für.

Das (erste) Problem liegt daran das `datetime` an der Stelle wo es kracht nicht den Wert hat den Du da anscheinend vermutest. Lass Dir den Wert und Typ einfach mal ausgeben und vergleich das mit dem Wert und Typ den das haben müsste.

Und vielleicht auch mal die Werte und Typen von `starttime` und `stoptime`. Und dann überleg mal ob der Umweg den Du da versuchst überhaupt nötig ist.

Als letztes stellt sich noch die inhaltliche Frage *was* Du an der Stelle überhaupt berechnen möchtest. So wie es aussieht ist das die Zeitspanne zwischen der Startzeit des `Time`-Objektes mit der ältesten Startzeit und der Endzeit des `Time`-Objektes mit der ältesten Endzeit. Dir ist klar dass es sich dabei nicht zwangsläufig um das selbe `Time`-Objekt handeln muss und das ist so gewollt?
Antworten