2012-09-16 20 views
23

Von:Wie füge ich python datetime.time Delta hinzu?

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

A timedelta object represents a duration, the difference between two dates or times.

Warum erhalte ich Fehler mit diesem:

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

Antwort

35

datetime.time Objekte nicht unterstützen zusätzlich mit datetime.timedelta s.

Es gibt jedoch eine natürliche Definition, Uhrarithmetik. Man könnte es wie folgt 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 zu einem datetime.datetime Objekt wird der Delta dann zugegeben, und das Ergebnis fiel zurück auf eine datetime.time Objekt.

+9

Es ist eine Menge Arbeit. Ich möchte nur eine Zeitverschiebung berechnen, Python :). aber es ist Lösung, danke. – xliiv

+0

Eine Sache, die hier zu beachten ist, ist, dass, wenn "t" kleiner als "Delta" ist, Sie am Ende mit "dt.date (1,1,0)" enden, was ein 'OverflowError: Datumswert außerhalb des Bereichs ist '. Eine Möglichkeit, dies zu erreichen, besteht darin, Werte in 'dt.date (...)' zu erhöhen. Aber das ist immer noch ein Problem, mit dem man vorsichtig sein muss. – Akavall

2

Wie würde das funktionieren? datetime.datetime.now().time() gibt nur Stunden, Minuten, Sekunden usw. zurück, es gibt keine Datumsinformation was .time() zurückgibt, nur Zeit.

Dann, was sollte 18:00:00 + 8 hours zurückgeben?
Es gibt keine Antwort auf diese Frage, und deshalb können Sie keine Zeit und ein 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. 
+1

Während Ihr allgemeiner Punkt korrekt ist, 6pm + 5 Stunden = 11pm, so ist das ein schlechtes Beispiel, und '.time()' gibt keinen Zeitstempel zurück - ein Zeitstempel enthält oft genug Informationen, um ein Datum abzuleiten, Ein 'datetime.time' Objekt nicht. – agf

+0

@agf, ja, ich habe gerade meinen Beitrag bearbeitet:). Ich werde auch die Verwendung von Timestamp ändern! –

+0

Ok, ich verstehe Erklärung, ich werde es gewohnt sein. rufen Sie mich ein dummes, aber in meiner Argumentation, Stunden nur Datum zu addieren, sollte Ausnahme in jedem von beiden auslösen :) jedoch ist es in dieser Form nicht kompakt. Ich denke, das Hinzufügen von Zeit zu Zeit innerhalb eines Tages (24 Stunden) könnte möglich sein. Wie kann ich das im aktuellen Zustand erreichen, wie 2h33m bis jetzt hinzufügen()? – xliiv

1

Hier ist eine Funktion, die ein time auf eine timedelta fügt hinzu:

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

Dieses so lange das erwartete Ergebnis liefern wird, wie Sie in einer Art und Weise hinzufügen, mal nicht, dass eine Mitternachtsgrenze überschreitet.

Verwandte Themen