У меня есть два значения datetime.time
, exit
и enter
и я хочу сделать что-то вроде:
duration = exit - enter
Тем не менее, я получаю эту ошибку:
Ошибка типа: неподдерживаемые типы операндов для -: 'datetime.time' и 'datetime.time
Как мне сделать это правильно? Одним из возможных решений является преобразование переменных time
переменные datetime
и времени, а затем вычитание, но я уверен, что у вас, ребята, должен быть лучший и более чистый способ.
Ответ 1
Попробуйте следующее:
from datetime import datetime, date
datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)
combine
строит datetime, которое можно вычесть.
Ответ 2
Использование:
from datetime import datetime, date
duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning)
Использование date.min
немного более кратким и работает даже в полночь.
Это может быть не так, если date.today()
может возвращать неожиданные результаты, если первый вызов происходит в 23:59:59, а следующий - в 00:00:00.
Ответ 3
вместо использования времени try timedelta:
from datetime import timedelta
t1 = timedelta(hours=7, minutes=36)
t2 = timedelta(hours=11, minutes=32)
t3 = timedelta(hours=13, minutes=7)
t4 = timedelta(hours=21, minutes=0)
arrival = t2 - t1
lunch = (t3 - t2 - timedelta(hours=1))
departure = t4 - t3
print(arrival, lunch, departure)
Ответ 4
datetime.time
не поддерживает это, потому что он почти бессмыслен для вычитания времени таким образом. Используйте полный datetime.datetime
, если вы хотите это сделать.
Ответ 5
Библиотека Python Timedelta должна делать то, что вам нужно. timedelta
возвращается, когда вы вычитаете два экземпляра datetime
.
import datetime
dt_started = datetime.datetime.utcnow()
# do some stuff
dt_ended = datetime.datetime.utcnow()
print((dt_ended - dt_started).total_seconds())
Ответ 6
import datetime
def diff_times_in_seconds(t1, t2):
# caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1
h1, m1, s1 = t1.hour, t1.minute, t1.second
h2, m2, s2 = t2.hour, t2.minute, t2.second
t1_secs = s1 + 60 * (m1 + 60*h1)
t2_secs = s2 + 60 * (m2 + 60*h2)
return( t2_secs - t1_secs)
# using it
diff_times_in_seconds( datetime.datetime.strptime( "13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime( "14:02:39", '%H:%M:%S').time())
Ответ 7
У меня была аналогичная ситуация, так как мы с вами закончили использование внешней библиотеки под названием arrow.
Вот как это выглядит:
>>> import arrow
>>> enter = arrow.get('12:30:45', 'HH:mm:ss')
>>> exit = arrow.now()
>>> duration = exit - enter
>>> duration
datetime.timedelta(736225, 14377, 757451)
Ответ 8
У вас есть два объекта datetime.time, поэтому вы просто создаете две timedelta с использованием datetime.timedetla, а затем вычитаете, как сейчас, используя операнд "-". Ниже приведен пример способа вычитания два раза без использования datetime.
enter = datetime.time(hour=1) # Example enter time
exit = datetime.time(hour=2) # Example start time
enter_delta = datetime.timedelta(hours=enter.hour, minutes=enter.minute, seconds=enter.second)
exit_delta = datetime.timedelta(hours=exit.hour, minutes=exit.minute, seconds=exit.second)
difference_delta = exit_delta - enter_delta
diff_delta - это ваша разница, которую вы можете использовать по своим причинам.
Ответ 9
datetime.time
не может этого сделать - но вы можете использовать datetime.datetime.now()
start = datetime.datetime.now()
sleep(10)
end = datetime.datetime.now()
duration = end - start