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.