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

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

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

например, если входные данные 2: 00PM и 4 :00PM (сейчас), я хотел бы сказать "-7200", представляющий событие произошло два часа назад. Если входные сигналы Пт 4: 00ПМ (теперь) и Солнце 5:00ПМ, то выход должен быть "176400" секунд, представляя 2 дня и 1 час от теперь.

вот вещи, которые я пробовал...

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

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

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

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