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?


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:



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()


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.