Перетворити 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

Чи існує вбудований метод для цього?


8
@RestRisiko - ти маєш рацію. І все-таки корисно мати питання про Stack Overflow, тому наступного разу, коли я або хтось інший, Googles за це, він отримає хорошу відповідь як найкращий результат.
ripper234

Ми можемо обговорити альтернативні визначення поняття "добро" пізніше; будь ласка, прочитайте мою відповідь, перш ніж тікати :)
Джон Махін

Існує кілька проблем з обчисленнями time1та diffу вашому коді. Щоб отримати поточний час utc як об’єкт наївного часу, скористайтеся datetime.utcnow()натомість. Щоб зрозуміти, чому слід використовувати UTC замість місцевого часу, щоб знайти різницю, див. Знайти, чи минуло 24 години між датами - Python . time.monotonic()може бути кращим знайти минулий час між подіями (замість time.time()або datetime.utcnow()).
jfs

Відповіді:


384

Використовуйте timedelta.total_seconds().

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

26
Новий у python 2.7
Євген

7
Якщо комусь все-таки потрібна сумісність із 2.6: див. Stackoverflow.com/questions/3318348/… про те, як самостійно продовжити datetime.timedelta новим методом.
Uwe Geuder

6
datetime.timedelta.total_seconds (time2-time1) у Python3.6
Russo

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.