#python #datetime
#python #datetime
Вопрос:
datetime1 = '2020-08-19 10:13:19'
datetime2 = '2020-08-19 19:00:00'
diff = datetime1 - datetime2
Разница — это объект timedelta с:
diff.days = -1
diff.seconds = 54766 = 15.22 hours
Разница между двумя датами времени составляет всего около 9 часов. Почему он показывает, что количество дней равно ‘1’ и 15,22 часа? Как понять разницу двух datetimes?
Ответ №1:
Если вы вычтете более раннее datetime из более позднего datetime, вы получите положительный timedelta, как и следовало ожидать.
Наоборот, вы получаете отрицательное значение timedelata в необычном формате.
Но когда вы вычисляете -1 day 15 hours = -24 hours 15 hours = -9 hours
, результат правильный.
Конечно, выполнение этого вычисления вручную — это не то, что мы хотим.
Итак, либо избегайте вычитания более поздней даты-времени из более ранней даты-времени:
# to get an absolute timedelta
if datetime2 > datetime1:
print(datetime2 - datetime1)
else:
print(datetime1 - datetime2)
Или используйте .total_seconds()
:
print((datetime1 - datetime2).total_seconds())
-31601.0
print((datetime2 - datetime1).total_seconds())
31601.0
Ответ №2:
В этом примере разница между двумя объектами datetime имеет отрицательное количество дней и положительное количество часов.
import datetime
datetime1 = datetime.datetime.fromisoformat('2020-08-19 10:13:19')
datetime2 = datetime.datetime.fromisoformat('2020-08-19 19:00:00')
print(datetime1 - datetime2)
-1 day, 15:13:19
# divide by timedelta() (with argument of hours, minutes, seconds, etc.
print((datetime1 - datetime2) / datetime.timedelta(hours=1)) # in hours
-8.778055555555556
Вот интересное интервью с основным разработчиком, который поддерживает дату / время в CPython:https://talkpython.fm/episodes/show/271/unlock-the-mysteries-of-time-pythons-datetime-that-is
Обновить
Вы можете рассчитать разницу во времени в минутах, днях или других единицах, указав другой параметр в .timedelta()
:
print((datetime1 - datetime2) / datetime.timedelta(minutes=1)) # in minutes
-526.68
print((datetime1 - datetime2) / datetime.timedelta(days=1)) # in days
-0.3658
Комментарии:
1. Не отвечает на вопрос.
2. @jsmart, что означает -8.778? Является ли фактическая разница во времени двух объектов?
3. Привет, -8.778 — это разница во времени в часах; обратите внимание, что знаменатель
timedelta(hours=1)
. Если бы вы хотели разницу во времени в минутах или днях, вы бы сделали это.timedelta(minutes=1)
или.timedelta(days=1)