Non time.time()
nel modulo Python tempo tornare ora del sistema o il tempo in UTC?
Non time.time()
nel modulo Python tempo tornare ora del sistema o il tempo in UTC?
Risposte:
La time.time()
funzione restituisce il numero di secondi dall'epoca, in secondi. Si noti che l '"epoca" è definita come l'inizio del 1 ° gennaio 1970 in UTC. Quindi l'epoca è definita in termini di UTC e stabilisce un momento globale nel tempo. Indipendentemente da dove vi troviate "epoche passate" (time.time ()) restituisce lo stesso valore nello stesso momento.
Ecco alcuni esempi di output che ho eseguito sul mio computer, convertendoli anche in una stringa.
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>
La ts
variabile è il tempo restituito in secondi. L'ho quindi convertito in una stringa utilizzando la datetime
libreria rendendola una stringa leggibile dall'uomo.
import time
quando il datetime sostanzialmente ti dà il timestamp. Rimuovi i millisecondi -str(datetime.datetime.now()).split('.')[0]
time.time()
non è in alcun fuso orario . "secondi dall'epoca" è un termine; non sono trascorsi secondi da un certo momento (epoca). Puoi convertirlo facilmente nell'ora locale (con database tz) e / o fuso orario UTC. tra l'altro, se si rilascia .strftime()
il risultato è (quasi) lo stesso (+/- microsecondi).
Questo è per la forma testuale di un timestamp che può essere usato nei tuoi file di testo. (Il titolo della domanda era diverso in passato, quindi l'introduzione di questa risposta è stata modificata per chiarire come potrebbe essere interpretata come l'ora. [Aggiornato il 01-01-2016])
È possibile ottenere il timestamp come stringa utilizzando il .now()
o .utcnow()
del datetime.datetime
:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
Le now
differisce da utcnow
come previsto - altrimenti funzionano allo stesso modo:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
È possibile eseguire il rendering della data / ora nella stringa in modo esplicito:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Oppure puoi essere ancora più esplicito nel formattare il timestamp nel modo che preferisci:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
Se si desidera il formato ISO, utilizzare il .isoformat()
metodo dell'oggetto:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Puoi usarli nelle variabili per i calcoli e la stampa senza conversioni.
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
è malvagio. Crea un datetime ingenuo che non è l'ora locale. A meno che l'ora locale non sia UTC, sarà SBAGLIATA. Usa datetime.datetime.now(datetime.timezone.utc)
invece. Ciò crea un datetime consapevole del fuso orario che rappresenta l'ora corrente.
Basandomi sulla risposta di #squiguy, per ottenere un vero timestamp vorrei digitare cast da float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Almeno questo è il concetto.
type(time.time())
dà<type 'float'>
int()
è polimorfico. Restituirebbe long
se necessario su vecchie versioni di Python - tutti gli interi sono lunghi sulle nuove versioni di Python.
La risposta potrebbe essere né l'una né l'altra.
nessuno dei due: time.time()
restituisce approssimativamente il numero di secondi trascorsi dall'epoca. Il risultato non dipende dal fuso orario, quindi non è né UTC né l'ora locale. Ecco la definizione POSIX per "Seconds Since the Epoch" .
entrambi: time.time()
non richiede che l'orologio del sistema sia sincronizzato, quindi riflette il suo valore (anche se non ha nulla a che fare con il fuso orario locale). Computer diversi possono ottenere risultati diversi contemporaneamente. D'altra parte se l'ora del computer è sincronizzata, è facile ottenere l'ora UTC dal timestamp (se ignoriamo i secondi bisestili):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
Su come ottenere i timestamp dall'ora UTC in varie versioni di Python, vedi Come posso ottenere una data convertita in secondi dall'epoca secondo UTC?
datetime.utcfromtimestamp
mentre ci sono 308 voti positivi su una risposta con datetime.fromtimestamp
:-(
time.time()
restituisce la funzione (è molto breve). Il tuo commento affronta qualche altra domanda (hai cambiato il tuo commento da quando ho iniziato a rispondere. In peggio). Una nota a parte; la parola "corretto" dovrebbe essere usata con parsimonia (i fusi orari sono complicati - non esiste un proiettile d'argento - solo compromessi per un particolare caso d'uso).
datetime.datetime.utcfromtimestamp(ts)
. A meno che l'ora locale non sia UTC, sarà SBAGLIATA, poiché crea un datetime ingenuo che non è l'ora locale. Usa datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
invece. Ciò crea un datetime consapevole del fuso orario che rappresenta lo stesso istante del timestamp.
naive_dt.astimezone()
non esistesse come implicito bytes.encode()
non esiste più in Python 3. È vero che in molti casi è utile lavorare con l'ora UTC internamente. Ci sono molte cose che si possono dire sul modulo datetime (ho risposto a abbastanza domande per ottenere un badge d'oro) la maggior parte sono fuori portata per la domanda: cosa time.time()
ritorna.
Alla fine mi sono accontentato di:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
restituisce decimale / float come 1574115250.818733
e millisecondi-poiché-epoca è facilmente int(time.time() * 1000)
ad esempio1574115254915
Non esiste una "epoca" in un fuso orario specifico. L'epoca è ben definita come un momento specifico nel tempo, quindi se si modifica il fuso orario, anche il tempo stesso cambia. In particolare, questa volta lo è Jan 1 1970 00:00:00 UTC
. Quindi time.time()
restituisce il numero di secondi dall'epoca.
il timestamp è sempre time in utc, ma quando lo chiami datetime.datetime.fromtimestamp
ti restituisce il tempo nel tuo fuso orario locale corrispondente a questo timestamp, quindi il risultato dipende dal tuo locale.
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
Esiste una bella libreria arrow
con comportamenti diversi. Nello stesso caso restituisce l'oggetto time con fuso orario UTC.
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>