Come ottenere i secondi dall'epoca dall'output time + date di gmtime ()?


162

Come si fa il contrario gmtime(), dove si inserisce l'ora + la data e si ottiene il numero di secondi?

Ho delle stringhe come 'Jul 9, 2009 @ 20:02:58 UTC'e voglio recuperare il numero di secondi tra l'epoca e il 9 luglio 2009.

Ho provato time.strftimema non so come usarlo correttamente, o se è il comando corretto da usare.

Risposte:


123

Se sei arrivato qui perché un motore di ricerca ti ha detto che questo è come ottenere il timestamp di Unix, smetti di leggere questa risposta. Scorri verso il basso uno.

Se vuoi invertire time.gmtime(), vuoi calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Puoi trasformare la tua stringa in una tupla temporale time.strptime(), che restituisce una tupla temporale a cui puoi passare calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Maggiori informazioni sul modulo calendario qui


16
Se stai cercando il tempo dell'epoca unix corrente, fai riferimento al commento di @ DanJ o alla risposta di Naren, questa risposta non è corretta!
Kosii,

641

Usa il modulo temporale :

epoch_time = int(time.time())

14
@DanJ: è il numero di secondi trascorsi dall'epoca (un momento fisso nel tempo) ed è lo stesso in qualsiasi fuso orario. Tuttavia, se ignoriamo le istanze temporali intorno ai secondi bisestili; è facile convertirlo in UTC se timeutilizza Unix epoch (1970).
jfs,

43
Nota che questo non è ciò che l'OP stava chiedendo, ma è quello che volevo. Quindi +1.
fearless_fool,

6
è la risposta a ciò che viene chiesto nel titolo: "ottenere il tempo dall'epoca". +1
AlejandroVD,

@JFSebastian questo dà epoca ai secondi. Come posso ottenere la risoluzione fino a millisecondi usando la stessa risposta sopra?
Marlon Abeykoon,

2
per estendere il mio commento sopra : il time.time()valore NON dipende dal fuso orario locale (se escludiamo fusi orari "giusti" e simili) ad esempio, se restituisce il tempo POSIX (come accade sulla maggior parte dei sistemi), allora è il numero di secondi SI da l'Epoch (1970-01-01UTC) senza contare i secondi bisestili. Questo valore può essere convertito in UTC (esclusi i secondi bisestili) ma non è UTC . @MarlonAbeykoon: mi piace questa risposta
jfs

10

Nota che time.gmtimemappa il timestamp 0a 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) ti dà un timestamp spostato di un importo che dipende dalla tua locale, che in generale potrebbe non essere 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

L'inverso di time.gmtimeècalendar.timegm :

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0

Ciò fornisce una migliore spiegazione ed esempio di time.mktime (che tiene conto del fuso orario corrente), grazie
Jkm

@Jkm: NON usare mktime()con gmtime(). mktime()accetta l' ora locale ma gmtime()restituisce l' ora UTC : il fuso orario locale potrebbe e probabilmente sarà diverso. "Il timestamp relativo alla tua locale" non ha senso: il timestamp POSIX non dipende dalla tua locale (fuso orario locale) - ha lo stesso valore in tutto il mondo. "secondi dall'epoca" è il timestamp POSIX nella maggior parte dei casi (anche su Windows) - cose come i fusi orari "giusti" che usano la scala temporale TAI non sono comuni. Vedi Time.time () di Python restituisce il timestamp locale o UTC?
jfs

@JF Sebastian Hai ragione. In realtà ho avuto qualche problema di mktime()recente. Per alcuni server Web Python (ad esempio Tornado), poiché il processo continua a funzionare, anche se modifico le impostazioni internazionali del sistema, le mktime()API chiamate dal server Web utilizzano ancora il vecchio fuso orario per generare l'oggetto time. Devo passare gmtime()e applicare manualmente l'offset gmt.
Jkm

5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Questo dovrebbe essere diverso da int(time.time()), ma è sicuro usare qualcosa di similex % (60*60*24)

datetime - Tipi di data e ora di base:

A differenza del modulo temporale, il modulo datetime non supporta i secondi bisestili.


3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")

Non riesco ad accedere allo strptime per qualche motivo. Ho importato datetime
calccrypto il

1
@calccrypto devi from datetime import datetimefarlo o faredatetime.datetime.strptime
pathikrit

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.