Подтвердить что ты не робот

Вычесть два раза в python

У меня есть два значения datetime.time, exit и enter и я хочу сделать что-то вроде:

duration = exit - enter

Тем не менее, я получаю эту ошибку:

Ошибка типа: неподдерживаемые типы операндов для -: 'datetime.time' и 'datetime.time

Как мне сделать это правильно? Одним из возможных решений является преобразование переменных time переменные datetime и времени, а затем вычитание, но я уверен, что у вас, ребята, должен быть лучший и более чистый способ.

4b9b3361

Ответ 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