Konwertuj timedelta na całkowitą liczbę sekund

186

Mam różnicę czasu

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

Jak znaleźć całkowitą liczbę sekund, które minęły? diff.secondsnie liczy dni. Mógłbym zrobić:

diff.seconds + diff.days * 24 * 3600

Czy jest do tego wbudowana metoda?

ripper234
źródło
8
@RestRisiko - masz rację. Mimo to dobrze jest mieć pytanie dotyczące przepełnienia stosu, więc następnym razem, gdy ja lub ktoś inny google, to ma dobrą odpowiedź jako najlepszy wynik.
ripper234
Później możemy omówić alternatywne definicje „dobrego”; proszę, przeczytaj moją odpowiedź, zanim uciekniesz :)
John Machin
Istnieje wiele problemów z przetwarzaniem time1i diffkodem. Aby uzyskać bieżący czas utc jako naiwny obiekt datetime, użyj datetime.utcnow()zamiast niego. Aby zrozumieć, dlaczego należy używać UTC zamiast czasu lokalnego, aby znaleźć różnicę, zobacz Znajdź, czy minęły 24 godziny między datami - Python . time.monotonic()lepiej byłoby znaleźć czas, jaki upłynął między zdarzeniami (zamiast time.time()lub datetime.utcnow()).
jfs

Odpowiedzi:

384

Zastosowanie timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Andreas Jung
źródło
26
Nowy w python 2.7
Evgeny
7
Jeśli ktoś nadal musi być kompatybilny z wersją 2.6: patrz stackoverflow.com/questions/3318348/..., aby dowiedzieć się, jak samodzielnie rozszerzyć datetime.timedelta za pomocą nowej metody.
Uwe Geuder,
6
datetime.timedelta.total_seconds (time2-time1) w Python3.6
Russo
8

Masz problem z datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))wyrażeniem.

(1) Jeśli wszystko, czego potrzebujesz, to różnica między dwoma momentami w sekundach, bardzo prosta time.time()jest praca.

(2) Jeśli używasz tych znaczników czasu do innych celów, musisz rozważyć, co robisz, ponieważ wynik ma duży zapach:

gmtime()zwraca krotkę czasową w UTC, ale mktime()oczekuje krotki czasowej w czasie lokalnym.

Jestem w Melbourne w Australii, gdzie standardem TZ jest UTC + 10, ale czas letni nadal obowiązuje do jutra rano, więc jest to UTC + 11. Kiedy wykonałem następujące czynności, to był 2011-04-02T20: 31 czasu lokalnego tutaj ... UTC był 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

Zauważysz, że t3, wynikiem twojego wyrażenia jest UTC + 1, który wydaje się być UTC + (moja lokalna różnica DST) ... mało znaczący. Powinieneś rozważyć użycie opcji, datetime.datetime.utcnow()która nie przeskoczy o godzinę, gdy DST włącza się / wyłącza i może dać ci większą precyzję niżtime.time()

John Machin
źródło
Dziękuję za wyjaśnienie. Z tego powodu, którego używam teraz, różnica nawet kilku godzin co jakiś czas nie jest ważna, ale na pewno to sprawdzę w przyszłości, kiedy napiszę coś bardziej znaczącego.
ripper234
-7

Możesz użyć modułu mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
gopisubramni
źródło