it-swarm.com.de

Wie füge ich Delta zu Python datetime.time hinzu?

Von:

http://docs.python.org/py3k/library/datetime.html#timedelta-objects

Ein Timedelta-Objekt repräsentiert eine Dauer, die Differenz zwischen zwei Datum oder Uhrzeit.

Warum bekomme ich hier einen Fehler?

>>> from datetime import datetime, timedelta, time
>>> datetime.now() + timedelta(hours=12)
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862)
>>> datetime.now().date() + timedelta(hours=12)
datetime.date(2012, 9, 16)

>>> datetime.now().time() + timedelta(hours=12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
27
xliiv

datetime.time objects unterstützt nicht den Zusatz mit datetime.timedeltas.

Es gibt jedoch eine natürliche Definition, die Uhr-Arithmetik. Sie könnten es folgendermaßen berechnen:

import datetime as dt
now = dt.datetime.now()
delta = dt.timedelta(hours = 12)
t = now.time()
print(t)
# 12:39:11.039864

print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time())
# 00:39:11.039864

dt.datetime.combine(...) hebt die datetime.time t auf ein datetime.datetime-Objekt hoch, das Delta wird dann hinzugefügt und das Ergebnis wird in ein datetime.time-Objekt zurückgesetzt.

43
unutbu

Wie würde das funktionieren? datetime.datetime.now().time() gibt nur Stunden, Minuten, Sekunden usw. zurück. Es gibt keine Datumsangaben, was .time() zurückgibt, nur die Uhrzeit. 

Was soll 18:00:00 + 8 hours dann zurückgeben?
Auf diese Frage gibt es keine Antwort, und deshalb können Sie keine Zeit und kein Timedelta hinzufügen. 

Mit anderen Worten:

18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012
18:28:44 + 5 hours # Doesn't make sense.
3
Thomas Orozco

Hier ist eine Funktion, die einem time ein timedelta hinzufügt:

def time_plus(time, timedelta):
    start = datetime.datetime(
        2000, 1, 1,
        hour=time.hour, minute=time.minute, second=time.second)
    end = start + timedelta
    return end.time()

Dies liefert das erwartete Ergebnis, solange Sie keine Zeiten hinzufügen, die eine Mitternachtsgrenze überschreiten.

1
David Foster

Ein datetime.time-Objekt kann in separate Integer-Komponenten aufgeteilt werden, die Sie hinzufügen können. Kein Timedelta erforderlich, zB:

from datetime import datetime, time
    time_now = datetime.now().time()
    twelve_hours_time =  time(time_now.hour + 12, time_now.minute)
0
Martin Jones

Alle oben genannten Lösungen sind zu kompliziert, OP hatte bereits gezeigt, dass wir Berechnungen zwischen datetime.datetime und datetime.timedelta ausführen können.

(datetime.now() + timedelta(hours=12)).time()

0
ssword