Qual é a maneira mais simples de encontrar a diferença entre 2 vezes em python?
Pergunta
Eu tenho 2 valores de tempo que têm o tipo datetime.time
.Eu quero descobrir a diferença deles.A coisa óbvia a fazer é t1 - t2, mas isso não funciona.Funciona para objetos do tipo datetime.datetime
mas não para datetime.time
.Então, qual é a melhor maneira de fazer isso?
Solução
Em primeiro lugar, observe que datetime.time é uma hora do dia, independente de um determinado dia e, portanto, a diferença entre quaisquer dois valores de datetime.time será menor que 24 horas.
Uma abordagem é converter ambos os valores datetime.time em valores comparáveis (como milissegundos) e encontrar a diferença.
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])
É um pouco chato, mas funciona.
Outras dicas
Também é um pouco bobo, mas você pode tentar escolher um dia arbitrário e incorporar cada horário nele, usando datetime.datetime.combine
, então subtraindo:
>>> 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)
Você poderia transformar ambos em objetos timedelta e subtraia-os um do outro, o que cuidará das sobras.Por exemplo:
>>> 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
Objetos timedelta negativos em Python obtêm um campo de dia negativo, com os outros campos positivos.Você pode verificar de antemão:a comparação funciona tanto em objetos de tempo quanto em objetos timedelta:
>>> dt2 < dt1
True
>>> t2 < t1
True
Python tem pytz (http://pytz.sourceforge.net) módulo que pode ser usado para aritmética de objetos de 'tempo'.Ele também cuida das compensações do horário de verão.A página acima contém vários exemplos que ilustram o uso de pytz.
Parece que isso não é suportado, pois não haveria uma boa maneira de lidar com estouros em datetime.time.Eu sei que esta não é uma resposta direta, mas talvez alguém com mais experiência em python do que eu possa levar isso um pouco mais longe.Para mais informações, veja isto: http://bugs.python.org/issue3250
Recupere os tempos em milissegundos e depois faça a subtração.
Environment.TickCount parece funcionar bem se você precisar de algo rápido.
int início = Environment.TickCount
...Faça alguma coisa()
int elapsedtime = Environment.TickCount - início
Jon