Каков самый простой способ найти разницу между 2 раза в python?

У меня есть 2 значения времени, которые имеют тип datetime.time. Я хочу найти их разницу. Очевидно, что t1 - t2, но это не работает. Он работает для объектов типа datetime.datetime, но не для datetime.time. Итак, каков наилучший способ сделать это?

Ответ 1

Во-первых, обратите внимание, что время 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])

Немного хромает, но он работает.

Ответ 2

Также немного глупо, но вы можете попробовать выбрать произвольный день и вставлять каждый раз в него, используя 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)

Ответ 3

Вы могли бы превратить оба в timedelta objects и вычесть их друг из друга, что позаботится о переносе. Например:

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

Ответ 4

Python имеет pytz (http://pytz.sourceforge.net) модуль, который может использоваться для арифметики объектов времени. Он также заботится о смещениях DST. На приведенной выше странице приведен ряд примеров, иллюстрирующих использование pytz.

Ответ 5

Кажется, что это не поддерживается, поскольку не было бы хорошего способа справиться с переполнениями в datetime.time. Я знаю, что это не ответ напрямую, но, возможно, кто-то, у кого больше опыта python, чем я, может немного поправить это. Для получения дополнительной информации см. Это: http://bugs.python.org/issue3250

Ответ 6

Получите время в миллисекундах, а затем выполните вычитание.

Ответ 7

Environment.TickCount, похоже, работает хорошо, если вам нужно что-то быстрое.

int start = Environment.TickCount

... DoSomething()

int elapsedtime = Environment.TickCount - start

Джон