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

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

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

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

Ответ 1

Используйте timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0

Ответ 2

У вас есть проблема так или иначе с выражением 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()

Ответ 3

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

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)