Почему разница двух объектов datetime такая?

#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)