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

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

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

Например, если входные данные - 14:00 и 16:00 (сейчас), я бы хотел сказать "-7200", представляя событие, произошедшее два часа назад. Если входными значениями являются пятница 16:00 (сейчас) и воскресенье 17:00, выходное значение должно составлять "176400" секунд, что означает два дня и 1 час с этого момента.

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

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

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

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

Это мой текущий код (все еще нужно исправить для "двунаправленного" сравнения) из ранее решенного вопроса 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: могу ли я просто получить в какой-то момент времени, в котором я хочу, значение всей разницы?

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

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

3 ответа

Решение

Вы должны быть в состоянии использовать

tdelta.total_seconds()

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

Пара заметок:

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

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

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

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

>>> 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 вычислено с включенным истинным делением.

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

У меня была такая же проблема пару месяцев назад. То, что вы ищете, это 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())))
Другие вопросы по тегам