Каков самый простой способ найти разницу между 2 раза в Python?
Вопрос
У меня есть 2 значения времени, которые имеют тип datetime.time
.Я хочу найти их разницу.Очевидно, что нужно сделать это t1 - t2, но это не работает.Он работает для объектов типа datetime.datetime
но не для datetime.time
.Так как же лучше всего это сделать?
Решение
Во-первых, обратите внимание, что datetime.time — это время суток, независимое от данного дня, поэтому разница между любыми двумя значениями datetime.time будет меньше 24 часов.
Один из подходов — преобразовать оба значения datetime.time в сравнимые значения (например, миллисекунды) и найти разницу.
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])
Это немного банально, но это работает.
Другие советы
Тоже немного глупо, но вы могли бы попробовать выбрать произвольный день и каждый раз вставлять в него, используя datetime.datetime.combine
, затем вычитая:
>>> 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)
Вы можете превратить оба в объекты timedelta и вычтите их друг из друга, что позаботится о переходящих остатках.Например:
>>> 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
Отрицательные объекты timedelta в Python получают отрицательное поле дня, а остальные поля — положительные.Вы можете проверить заранее:сравнение работает как с объектами времени, так и с объектами timedelta:
>>> dt2 < dt1
True
>>> t2 < t1
True
У Python есть pytz (http://pytz.sourceforge.net) модуль, который можно использовать для арифметики объектов «времени».Он также заботится о смещении летнего времени.На странице выше приведено несколько примеров, иллюстрирующих использование pytz.
Кажется, это не поддерживается, поскольку не существует хорошего способа справиться с переполнением в datetime.time.Я знаю, что это не прямой ответ, но, возможно, кто-то с большим опытом работы с Python, чем я, сможет пойти немного дальше.Для получения дополнительной информации см. это: http://bugs.python.org/issue3250
Получите время в миллисекундах, а затем выполните вычитание.
Environment.TickCount, кажется, работает хорошо, если вам нужно что-то быстро.
int start = Environment.TickCount
...Сделай что-нибудь()
int elapsedtime = Environment.TickCount — начало
Джон