Почему продолжительность между Datetime и Timedelta составляет 1 час? - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь автоматизировать документирование своего рабочего времени, и мне нужен способ узнать продолжительность между временем начала и окончания.Во время моего исследования я натолкнулся на этот вопрос, который, казалось, дал решение моей проблемы.

Однако при попытке получить продолжительность между "11:30" и "12:30"метод datetime.time () возвращает «00:00:00», и я понятия не имею, почему.

Это код, который я использую.

from datetime import datetime, timedelta
from time import strptime

start = strptime("11:30", "%H:%M")
stop = strptime("12:30", "%H:%M")

start_dt = datetime(100, 1, 1, start.tm_hour, start.tm_min)

duration = start_dt + timedelta(hours=stop.tm_hour,
                                minutes=stop.tm_min,
                                seconds=0)

print(duration.time())

Это мой ожидаемый(желательный) вывод: 01:00:00

Это фактический вывод, который я получаю: 00:00:00

Мне было интересно, было ли это как-то связано с методом time.strptime ()Я использую, чтобы получить значения часов и минут, поэтому я попробовал это также:

from datetime import datetime, timedelta

start_dt = datetime(100, 1, 1, 11, 30)

duration = start_dt + timedelta(hours=12,
                                minutes=30,
                                seconds=0)

print(duration.time())

Вывод остается прежним.Кто-нибудь знает почему?Я в полном недоумении.Любая помощь будет оценена.

1 Ответ

1 голос
/ 30 июня 2019

Короткий ответ : вы сложили два раза, в то время как для длительности вам нужно вычислить разницу .

, поскольку вы сложили два.Действительно, ваш start_dt выглядит следующим образом: 1-1-100 11:30, и вы добавили к этому 12:30, так что это означает:

start_dt   1-1-100  11:30
<b>+</b>                   12:30
-------------------------
           <b>2</b>-1-100  00:00

или полночь следующего дня.

Если вы хотите рассчитать разницу во времени, вы можете вычесть их, например:

start = <b>datetime.</b>strptime('11:30', '%H:%M')
stop = <b>datetime.</b>strptime('12:30', '%H:%M')
duration = stop <b>-</b> start  # minus (-), <i>not</i> plus (+)

, тогда это даст нам:

>>> duration
datetime.timedelta(0, 3600)
>>> str(duration)
'1:00:00'

, то есть 3600 секунд, илиодин час.

При этом время весьма неоднозначно , поскольку оно зависит от часового пояса: зависит от того, где вы находитесь, и когда (поскольку некоторые страны изменили часовые пояса), это может привести ксовершенно разные результаты.

...