2012-09-16 17 views
23

Da:Come aggiungere delta a python datetime.time?

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

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

Allora perché ottengo l'errore con questo:

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

risposta

35

datetime.time oggetti non supportano più con datetime.timedelta s.

C'è comunque una definizione naturale, l'aritmetica dell'orologio. Si potrebbe calcolare in questo modo:

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(...) solleva il datetime.time t a un oggetto datetime.datetime, il delta viene quindi aggiunto, e il risultato è caduto giù a un oggetto datetime.time.

+9

È molto lavoro. Voglio solo calcolare un time shift, python :). tuttavia è una soluzione, grazie. – xliiv

+0

Una cosa da notare qui è che se 't' è più piccolo di' delta', quindi, si finirà con 'dt.date (1,1,0)', che è un 'OverflowError: valore di data fuori intervallo '. Un modo per avvicinarsi a questo è aumentare i valori in 'dt.date (...)'. Ma questo è ancora un problema con cui bisogna stare attenti. – Akavall

2

Come questo lavoro? datetime.datetime.now().time() restituisce solo ore, minuti, secondi e così via, non ci sono informazioni sulla data che restituisce .time(), solo il tempo.

Quindi, cosa deve restituire 18:00:00 + 8 hours?
Non c'è una risposta a questa domanda, ed è per questo che non è possibile aggiungere un'ora e una data di scadenza.

In altre parole:

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

Mentre il tuo punto generale è corretto, 6pm + 5 ore = 11pm, quindi questo è un cattivo esempio e '.time()' non restituisce un timestamp - un timestamp spesso include informazioni sufficienti per ricavare una data, un oggetto 'datetime.time' no. – agf

+0

@agf, sì, stavo modificando il mio post in realtà:). Cambierò anche l'uso del timestamp! –

+0

Ok, capisco la spiegazione mi ci abituerò. chiamami uno stupido, ma nel mio ragionamento aggiungendo ore alla sola data dovrebbe sollevare un'eccezione in entrambi :) :) tuttavia non è compatto in questo modulo. Penso che l'aggiunta di volta in volta in un giorno (24 ore) potrebbe essere possibile. Come posso ottenerlo allo stato attuale, come aggiungere 2h33m ad ora()? – xliiv

1

Ecco una funzione che aggiunge una time ad 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() 

Questo fornirà il risultato atteso fino a quando non si aggiunge volte in modo che attraversa un confine di mezzanotte.

Problemi correlati