¿Cómo agregar delta a python datetime.time?

Desde:

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

Un objeto timedelta representa una duración, la diferencia entre dos fechas u horas.

Entonces, ¿por qué me equivoco con esto?

>>> 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 "", line 1, in  TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta' 

datetime.time objetos datetime.time no admiten la adición con datetime.timedelta s.

Sin embargo, hay una definición natural, la aritmética del reloj. Podrías calcularlo así:

 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(...) eleva el datetime.time t a un objeto datetime.datetime , luego se agrega el delta y el resultado se regresa a un objeto datetime.time .

¿Cómo funcionaría esto? datetime.datetime.now().time() devuelve solo horas, minutos, segundos, etc., no hay información de fecha lo que .time() , solo la hora.

Entonces, ¿a qué deben 18:00:00 + 8 hours ?
No hay respuesta a esa pregunta, y es por eso que no puedes agregar un tiempo y una fecha de entrega.

En otras palabras:

 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. 

Aquí hay una función que agrega un time a un timedelta :

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

Esto proporcionará el resultado esperado siempre y cuando no agregue tiempos de una manera que cruce un límite de medianoche.

Un objeto datetime.time puede dividirse en componentes enteros separados que puede agregar. No hay necesidad de timedelta por ejemplo:

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

Todas las soluciones anteriores son demasiado complicadas, OP ya había demostrado que podemos hacer cálculos entre datetime.datetime y datetime.timedelta , así que, ¿por qué no hacerlo?

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