Python - сравнение даты и времени с использованием временных меток, timedelta - программирование
Подтвердить что ты не робот

Python - сравнение даты и времени с использованием временных меток, timedelta

Я потратил минувший час на то, чтобы копаться в документах Python и многих вопросах SO; пожалуйста, простите меня за то, что я был еще одним новичком Python, пойманным в ловушку тайны разницы во времени в Python.

Моя цель - определить разницу между текущим временем и определенной датой/временем, независимо от того, была ли она в прошлом/будущем и вернуть рабочий формат, такой как секунды.

Например, если входные данные - 2:00 PM и 4:00 PM (сейчас), я хотел бы сказать "-7200", представляя, что событие произошло через два часа AGO. Если входные данные: Fri 4:00 PM (сейчас) и Sun 5:00 PM, выход должен быть "176400" секунд, что означает два дня и 1 час.

Вот что я пробовал...

  • Моя первая версия была функцией, которая взяла строчную метку времени и сослала ее на несколько переменных, а затем сравнила их. Это было неудобно со многими ошибками, и я предполагаю, что если бы я разместил его здесь, я был бы ответственен за выбросы программистов.

  • Я наткнулся на эту магическую функцию timedelta и исследовал документы и SO, но я не думаю, что это делает то, что я ищу.

  • У меня возникла идея преобразовать обе временные метки в секунды с эпохи, а затем вычесть, но это становится проблемой, если вычитание неверно (разные случаи, если это событие в будущем), и я чувствую например, добавление, если инструкции для проверки знака секунд были бы неудобными и что-то избегать.

Это мой текущий код (по-прежнему необходимо установить для "двунаправленного" сравнения), из ранее разрешенного вопроса SO:

now = time.strftime("%a %b %d %H:%M:%S %Y")
then = time.ctime(os.path.getmtime("x.cache"))
tdelta = datetime.strptime(now, '%a %b %d %H:%M:%S %Y') - datetime.strptime(then, '%a %b %d %H:%M:%S %Y')

И я чувствую, что мне нужно как-то оттянуть секунды от этого, как в этом вопросе: timedelta от Python: не могу ли я просто получить какое-то время, я хочу получить значение всей разницы?

Но я теряюсь на том, как соединить эти точки.

Как я могу это сделать?

4b9b3361

Ответ 1

Вы должны иметь возможность использовать

tdelta.total_seconds()

чтобы получить значение, которое вы ищете. Это связано с тем, что tdelta является timedelta объектом, как и любая разница между объектами datetime.

Несколько примечаний:

  • Использование strftime, за которым следует strptime, является излишним. Вы должны получить текущее время и время datetime.now.
  • Аналогично, использование time.ctime, за которым следует strptime, больше, чем нужно. Вы можете получить другой объект datetime с помощью datetime.fromtimestamp.

Итак, ваш последний код может быть

now = datetime.now()
then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
tdelta = now - then
seconds = tdelta.total_seconds()

Ответ 2

Что не так с этим методом?

>>> from datetime import datetime
>>> a = datetime.now()
>>> b = datetime.now() # after a few seconds
>>> delta = a-b
>>> delta.total_seconds()
-6.655989

Обратите внимание, что total_seconds доступен только в Python 2.7 <, но в документации есть:

Эквивалент (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6, вычисленный с включенным истинным делением.

что дает точный результат.

Ответ 3

У меня была такая же проблема пару месяцев назад. То, что вы ищете, это datetime.timedelta и datetime.datetime.fromtimestamp(). Вот пример того, как их использовать, чтобы исправить вашу проблему.

import datetime
import time
t1 = time.time()
#do something to kill time or get t2 from somewhere
a = [i for i in range(1000)]
t2 = time.time()
#get the difference as datetime.timedelta object
diff=(datetime.datetime.fromtimestamp(t1) - datetime.datetime.fromtimestamp(t2))
#diff is negative as t2 is in the future compared to t2
print('difference is {0} seconds'.format(abs(diff.total_seconds())))