Converti timedelta in secondi totali


186

Ho una differenza di tempo

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

Ora, come posso trovare il numero totale di secondi trascorsi? diff.secondsnon conta giorni. Potrei fare:

diff.seconds + diff.days * 24 * 3600

Esiste un metodo integrato per questo?


8
@RestRisiko - hai ragione. Tuttavia, è utile avere la domanda su StackTranslate.it, quindi la prossima volta che io, o qualcun altro, utilizzeremo Google, avrà una buona risposta come risultato migliore.
ripper234,

Possiamo discutere in seguito delle definizioni alternative di "buono"; per favore leggi la mia risposta prima di scappare :)
John Machin,

Esistono diversi problemi con l'informatica time1e diffnel tuo codice. Per ottenere l'ora utc corrente come oggetto datetime ingenuo, utilizzare datetime.utcnow()invece. Per capire perché dovresti usare UTC invece dell'ora locale per trovare la differenza, vedi Trova se sono trascorse 24 ore tra i periodi di dati - Python . time.monotonic()potrebbe essere preferibile trovare il tempo trascorso tra gli eventi (anziché time.time()o datetime.utcnow()).
jfs

Risposte:



8

Hai un problema in un modo o nell'altro con la tua datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))espressione.

(1) Se tutto ciò che serve è la differenza tra due istanti in pochi secondi, il semplice time.time()fa il lavoro.

(2) Se stai usando questi timestamp per altri scopi, devi considerare cosa stai facendo, perché il risultato ha un grande odore dappertutto:

gmtime()restituisce una tupla oraria in UTC ma si mktime()aspetta una tupla oraria nell'ora locale.

Sono a Melbourne, in Australia, dove la TZ standard è UTC + 10, ma l'ora legale è ancora in vigore fino a domani mattina, quindi è UTC + 11. Quando ho eseguito il seguente, era 2011-04-02T20: 31 ora locale qui ... UTC era 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

Noterai che t3, il risultato della tua espressione è UTC + 1, che sembra essere UTC + (la mia differenza di ora legale locale) ... non molto significativo. Dovresti considerare l'uso datetime.datetime.utcnow()che non salterà di un'ora quando l'ora legale si accende / spegne e potresti darti più precisione ditime.time()


Grazie per il chiarimento. Per lo scopo che sto usando in questo momento, una differenza anche di poche ore ogni tanto non è importante, ma sarò sicuro di verificarlo in futuro quando scriverò qualcosa di più significativo.
ripper234

-7

È possibile utilizzare il modulo mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.