Qual è il modo più semplice per ottenere l'ora GMT corrente in formato timestamp Unix?


175

Pitone fornisce diversi pacchetti ( datetime, time, calendar) come si può vedere qui , al fine di gestire il tempo. Ho fatto un grosso errore usando quanto segue per ottenere l'ora GMT correntetime.mktime(datetime.datetime.utcnow().timetuple())

Qual è un modo semplice per ottenere l'ora GMT corrente nel timestamp Unix?


1
Cosa sono gli input / output? datetime.utcnow()restituisce l'ora UTC corrente come oggetto datetime (suppongo che tu voglia UTC quando parli di "ora GMT"). time.time()restituisce il timestamp Unix direttamente come numero float. Ecco come convertire datetime.date/datetime.datetime che rappresenta l'ora in UTC in data / ora POSIX .
jfs,

Il metodo proposto è sbagliato o troppo dettagliato? Correlati: stackoverflow.com/questions/15940280/...
Ciro Santilli郝海东冠状病六四事件法轮功

Perché il tuo metodo è stato un errore?
skeller88,

Risposte:


230

Vorrei usare time.time () per ottenere un timestamp in pochi secondi dall'epoca.

import time

time.time()

Produzione:

1369550494.884832

Per l'implementazione standard di CPython sulla maggior parte delle piattaforme, questo restituirà un valore UTC.


21
Il problema è che l'orologio locale della tua macchina potrebbe non essere in UTC.
9000,

@ 9000: corretto, anche se insisterei sempre su UTC in qualsiasi ambiente in cui il tempo è importante. E ha chiesto la soluzione più semplice. Si noti che con CPython su piattaforme moderne, tra cui Linux, BSD, Mac OS X e Windows, restituiranno UTC per time.time (). Ciò rispecchia il comportamento della funzione temporale della libreria standard C su questi SO.
Edmond Burnett

66
@ 9000: il fuso orario locale non ha importanza. L'ora Unix corrisponde all'ora UTC (se ignoriamo l'ora attorno ai secondi bisestili). Pensaci: il timestamp è il numero di secondi trascorsi dall'epoca (un momento fisso nel tempo): perché dovrebbe dipendere dall'orologio locale della macchina del fuso orario? In un dato momento, l'ora di Unix è la stessa in tutto il mondo. Alcune piattaforme (sconosciute) potrebbero utilizzare un'epoca diversa, ma il suo valore non dipenderà ancora dal fuso orario locale.
jfs,


125
import time

int(time.time()) 

Produzione:

1521462189

42

questo aiuta?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Come convertire l'oggetto datetime Python UTC in data / ora UNIX


@Cairnarvon Quello era solo un esempio. Se vuoi il timestamp corrente, puoi semplicemente chiamare time.time()e non hai bisogno di alcuna conversione datetime.
Messa

1
FWIW: non è l'ora UTC, ma viene convertita in ora locale l'ora UTC. Per ottenere un timestamp in UTC devi fare qualcos'altro.
Sherlock70,

18

O semplicemente usando il modulo standard datetime

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

È possibile troncare o moltiplicare a seconda della risoluzione desiderata. Questo esempio sta producendo millis.

Se si desidera un timestamp Unix corretto (in secondi), rimuovere il* 1000


Il codice in modo molto specifico sta forzando il tempo in un numero intero, quindi sono confuso perché il testo di output è un numero decimale?
Weston,

mio cattivo, ho aggiunto il casting int più tardi
Maresh

Questo è l'equivalente esatto della momentlibreria Javascript moment().utc().valueOf(). Esattamente quello che stavo cercando. Grazie
azhar22k,

Il timestamp UNIX dovrebbe essere secondi dal 1970. La tua soluzione non produce questo.
skyking

1
"Puoi troncare o moltiplicare a seconda della risoluzione che desideri" Rilascia la parte * 1000 e otterrai secondi.
Maresh,

18

python2 e python3

è bene usare il modulo temporale

import time
int(time.time())

1573708436

puoi anche usare il modulo datetime, ma quando usi strftime ('% s'), ma strftime converti l'ora nella tua ora locale!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()

2
Essere in UTC + 1, time.time()e datetime.utcnow().timestamp()non senza dare lo stesso valore!
user136036

Anche se mi aspettavo che la seconda opzione fosse corretta, ho dovuto usare datetime.now (). Timestamp () per ottenere il valore corretto in UTC + 1100. Mi aspettavo che timestamp () funzionasse correttamente per entrambi ma non sembra
David Waterworth

Guardando più da vicino, sia datetime.utcnow () che datetime.now () restituiscono un datetime ingenuo (no tzinfo) e timestamp () sembra assumere locale quando tzinfo = null.
David Waterworth,

2

Mi piace questo metodo:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Gli altri metodi pubblicati qui non sono garantiti per fornire UTC su tutte le piattaforme o riportare solo secondi interi. Se vuoi la piena risoluzione, questo funziona, al micro-secondo.


1
Sfortunatamente questo non sembra dare UTC a meno che non ti trovi in ​​un fuso orario UTC + 0000. Usando utctimetupleinvece fa il trucco però.
skyking

1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Produzione:

1544524990

questo non ritorna come time.time()per me.
Alwinius

1
Questo probabilmente perché dt.utcnowrestituire un datetimesenza informazioni sul fuso orario. Quindi strftimepresuppone che datetimesia l'ora locale.
skyking

1
@skyking Questo è praticamente il problema per quasi tutte le risposte in questa pagina!
David Waterworth,

1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Uscita: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Uscita: 1572878043

  • Qui, possiamo vedere che il primo esempio fornisce un tempo più accurato del secondo.
  • Qui sto usando il primo.

1

Almeno in python3, funziona:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
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.