Qual è il modo più semplice per trovare la differenza tra 2 volte in Python?
Domanda
Ho 2 valori temporali che hanno il tipo datetime.time
.Voglio trovare la loro differenza.La cosa ovvia da fare è t1 - t2, ma non funziona.Funziona per oggetti di tipo datetime.datetime
ma non per datetime.time
.Allora qual è il modo migliore per farlo?
Soluzione
Innanzitutto, tieni presente che datetime.time è un'ora del giorno, indipendente da un determinato giorno, quindi la differenza tra due valori datetime.time qualsiasi sarà inferiore a 24 ore.
Un approccio consiste nel convertire entrambi i valori datetime.time in valori comparabili (ad esempio millisecondi) e trovare la differenza.
t1, t2 = datetime.time(...), datetime.time(...)
t1_ms = (t1.hour*60*60 + t1.minute*60 + t1.second)*1000 + t1.microsecond
t2_ms = (t2.hour*60*60 + t2.minute*60 + t2.second)*1000 + t2.microsecond
delta_ms = max([t1_ms, t2_ms]) - min([t1_ms, t2_ms])
È un po' noioso, ma funziona.
Altri suggerimenti
Anche un po' sciocco, ma potresti provare a scegliere un giorno arbitrario e a incorporarlo ogni volta, utilizzando datetime.datetime.combine
, quindi sottraendo:
>>> import datetime
>>> t1 = datetime.time(2,3,4)
>>> t2 = datetime.time(18,20,59)
>>> dummydate = datetime.date(2000,1,1)
>>> datetime.datetime.combine(dummydate,t2) - datetime.datetime.combine(dummydate,t1)
datetime.timedelta(0, 58675)
Potresti trasformarli entrambi in oggetti timedelta e sottrarli l'uno dall'altro, il che si occuperà dei riporti.Per esempio:
>>> import datetime as dt
>>> t1 = dt.time(23, 5, 5, 5)
>>> t2 = dt.time(10, 5, 5, 5)
>>> dt1 = dt.timedelta(hours=t1.hour, minutes=t1.minute, seconds=t1.second, microseconds=t1.microsecond)
>>> dt2 = dt.timedelta(hours=t2.hour, minutes=t2.minute, seconds=t2.second, microseconds=t2.microsecond)
>>> print(dt1-dt2)
13:00:00
>>> print(dt2-dt1)
-1 day, 11:00:00
>>> print(abs(dt2-dt1))
13:00:00
Gli oggetti timedelta negativi in Python ottengono un campo giorno negativo, con gli altri campi positivi.Potresti verificare in anticipo:il confronto funziona sia su oggetti tempo che su oggetti timedelta:
>>> dt2 < dt1
True
>>> t2 < t1
True
Python ha pytz (http://pytz.sourceforge.net) modulo che può essere utilizzato per l'aritmetica degli oggetti 'tempo'.Si occupa anche degli offset dell'ora legale.La pagina sopra contiene una serie di esempi che illustrano l'utilizzo di pytz.
Sembra che questo non sia supportato, poiché non ci sarebbe un buon modo per gestire gli overflow in datetime.time.So che questa non è una risposta diretta, ma forse qualcuno con più esperienza di Python di me può andare un po' oltre.Per maggiori informazioni, vedere questo: http://bugs.python.org/issue3250
Recupera i tempi in millisecondi e poi fai la sottrazione.
Environment.TickCount sembra funzionare bene se hai bisogno di qualcosa di veloce.
int inizio = Environment.TickCount
...Fare qualcosa()
int tempo trascorso = Environment.TickCount - inizio
Jon