Конвертировать timedelta в общее количество секунд

186

У меня разница во времени

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

Теперь, как мне узнать общее количество прошедших секунд? diff.secondsне считает дни. Я мог бы сделать:

diff.seconds + diff.days * 24 * 3600

Есть ли встроенный метод для этого?

ripper234
источник
8
@RestRisiko - ты прав. Тем не менее, полезно задать вопрос о переполнении стека, так что в следующий раз я или кто-то еще, Google за него, получат хороший ответ в качестве основного результата.
ripper234
Мы можем обсудить альтернативные определения «хорошо» позже; Пожалуйста, прочитайте мой ответ, прежде чем убежать :)
Джон Мачин
Есть много проблем с вычислениями time1и diffв вашем коде. Чтобы получить текущее время utc как наивный объект datetime, используйте datetime.utcnow()вместо этого. Чтобы понять, почему вы должны использовать UTC, а не местное время, чтобы найти разницу, смотрите Find, если между datetime прошло 24 часа - Python . time.monotonic()может быть предпочтительным, чтобы найти прошедшее время между событиями (вместо time.time()или datetime.utcnow()).
JFS

Ответы:

385

Использование timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Андреас Юнг
источник
26
Новое в питоне 2.7
Евгений
7
Если кому-то все еще требуется совместимость с 2.6: см. Stackoverflow.com/questions/3318348/… чтобы узнать, как расширить datetime.timedelta с помощью нового метода самостоятельно.
Уве Geuder
6
datetime.timedelta.total_seconds (time2-time1) в Python3.6
Руссо
8

У вас проблемы с тем или иным datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))выражением лица.

(1) Если все, что вам нужно, это разница между двумя моментами в секундах, то самое простое time.time()делает эту работу.

(2) Если вы используете эти временные метки для других целей, вам нужно подумать о том, что вы делаете, потому что результат сильно пахнет:

gmtime()возвращает кортеж времени в UTC, но mktime()ожидает кортеж времени по местному времени.

Я нахожусь в Мельбурне, Австралия, где стандартным TZ является UTC + 10, но летнее время остается в силе до завтрашнего утра, поэтому сейчас UTC + 11. Когда я выполнил следующее, это было 2011-04-02T20: 31 местное время здесь ... UTC было 2011-04-02T09: 31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

Вы заметите, что t3, результат вашего выражения UTC + 1, который выглядит как UTC + (моя локальная разница DST) ... не очень значимый. Вы должны рассмотреть возможность использования, datetime.datetime.utcnow()которое не будет прыгать на час при включении / выключении DST и может дать вам больше точности, чемtime.time()

Джон Мачин
источник
Спасибо за разъяснения. Для целей, которые я использую сейчас, разница даже в несколько часов время от времени не важна, но я обязательно проверю это в будущем, когда напишу что-то более значимое.
ripper234
-7

Вы можете использовать модуль mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
gopisubramni
источник