Как проще всего найти разницу между двумя значениями времени в Python?

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
13
0
10 658
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Вы можете преобразовать оба значения в объекты 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

Крисс: Вы могли бы серьезно преуспеть с примером здесь.

Arafangion 12.03.2009 06:09
Ответ принят как подходящий

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

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

Обратите внимание, что это решение не сохраняет знак. Кроме того, delta_ms = abs (t1_ms - t2_ms) немного проще для понимания и сохраняет, по крайней мере, вычитание.

Blair Conrad 09.09.2008 05:19

не работает, если t1_ms до полуночи, а t2_ms после полуночи

Mr Fooz 06.11.2008 06:52

Разве это не должно быть * 1000000? Поскольку 1 с = 1000000 мкс.

Paggas 17.01.2010 20:56

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

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

нет смысла говорить о часовых поясах, зная только время, без указания Дата тоже. Если вы знаете дату и время, тогда может использоваться несколько определений различия

jfs 05.08.2015 14:36

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

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

int start = Environment.TickCount

...Сделай что-нибудь()

int elapsedtime = Environment.TickCount - начало

Джон

Другие вопросы по теме