¿ time.time()
En el módulo de tiempo de Python devuelve la hora del sistema o la hora en UTC?
¿ time.time()
En el módulo de tiempo de Python devuelve la hora del sistema o la hora en UTC?
Respuestas:
La time.time()
función devuelve el número de segundos desde la época, como segundos. Tenga en cuenta que la "época" se define como el inicio del 1 de enero de 1970 en UTC. Entonces, la época se define en términos de UTC y establece un momento global en el tiempo. No importa dónde se encuentre "segundos después de la época" (time.time ()) devuelve el mismo valor en el mismo momento.
Aquí hay algunos resultados de muestra que ejecuté en mi computadora, convirtiéndolos también en una cadena.
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
variable es el tiempo devuelto en segundos. Luego lo convertí en una cadena usando la datetime
biblioteca, convirtiéndolo en una cadena que sea legible por humanos.
import time
cuando datetime básicamente le da una marca de tiempo? Simplemente quite los milisegundos -str(datetime.datetime.now()).split('.')[0]
time.time()
no está en ninguna zona horaria . "segundos desde la época" es un término; no transcurren segundos desde algún punto en el tiempo (época). Puede convertirlo a su hora local (con la base de datos tz) y / o zona horaria UTC fácilmente. por cierto, si cae .strftime()
el resultado es (casi) el mismo (+/- microsegundos).
Esto es para la forma de texto de una marca de tiempo que se puede utilizar en sus archivos de texto. (El título de la pregunta era diferente en el pasado, por lo que la introducción de esta respuesta se cambió para aclarar cómo podría interpretarse como el momento. [Actualizado 2016-01-14])
Puede obtener la marca de tiempo como una cadena usando .now()
o .utcnow()
de datetime.datetime
:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
El now
difiere de utcnow
lo esperado; de lo contrario, funcionan de la misma manera:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
Puede representar la marca de tiempo en la cadena explícitamente:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
O puede ser aún más explícito para formatear la marca de tiempo de la manera que desee:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
Si desea el formato ISO, use el .isoformat()
método del objeto:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Puede usarlos en variables para realizar cálculos e imprimir sin conversiones.
>>> 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()
es malvado Crea una fecha y hora ingenua que no es la hora local. A menos que su hora local sea UTC, será INCORRECTO. Usar en su datetime.datetime.now(datetime.timezone.utc)
lugar. Esto crea una fecha y hora consciente de la zona horaria que representa la hora actual.
Basado en la respuesta de #squiguy, para obtener una marca de tiempo verdadera, escribiría cast from float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Al menos ese es el concepto.
type(time.time())
da<type 'float'>
int()
es polimórfico. Volvería long
si fuera necesario en las versiones antiguas de Python: todos los enteros son largos en las nuevas versiones de Python.
La respuesta podría ser ninguno o ambos.
ni: time.time()
devuelve aproximadamente el número de segundos transcurridos desde la época. El resultado no depende de la zona horaria, por lo que no es ni UTC ni hora local. Aquí está la definición POSIX para "Segundos desde la época" .
ambos: time.time()
no requiere que el reloj de su sistema esté sincronizado, por lo que refleja su valor (aunque no tiene nada que ver con la zona horaria local). Diferentes computadoras pueden obtener resultados diferentes al mismo tiempo. Por otro lado, si la hora de su computadora está sincronizada, es fácil obtener la hora UTC de la marca de tiempo (si ignoramos los segundos bisiestos):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
Sobre cómo obtener marcas de tiempo desde la hora UTC en varias versiones de Python, consulte ¿Cómo puedo convertir una fecha a segundos desde la época según UTC?
datetime.utcfromtimestamp
mientras hay 308 votos a favor en una respuesta con datetime.fromtimestamp
:-(
time.time()
devuelve la función (es muy corta). Su comentario aborda otra pregunta (ha cambiado su comentario desde que comencé a responderlo. Para peor). Una nota aparte; la palabra "correcto" debe usarse con moderación (las zonas horarias son complicadas, no hay una viñeta plateada, solo se intercambian para un caso de uso particular).
datetime.datetime.utcfromtimestamp(ts)
. A menos que su hora local sea UTC, será INCORRECTO, porque crea una fecha y hora ingenua que no es la hora local. Usar en su datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
lugar. Esto crea una fecha y hora consciente de la zona horaria que representa el mismo instante que la marca de tiempo.
naive_dt.astimezone()
no existiera como implícito bytes.encode()
ya no existe en Python 3. Es cierto que es beneficioso trabajar internamente con el tiempo UTC en muchos casos. Hay muchas cosas que se pueden decir sobre el módulo de fecha y hora (he respondido suficientes preguntas para obtener una insignia de oro), la mayoría están fuera del alcance de la pregunta: qué time.time()
devuelve.
Finalmente me conformé con:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
devuelve decimal / flotante como 1574115250.818733
y milisegundos-desde-época es fácil, int(time.time() * 1000)
por ejemplo1574115254915
No existe una "época" en una zona horaria específica. La época está bien definida como un momento específico en el tiempo, por lo que si cambia la zona horaria, la hora también cambia. Específicamente, esta vez es Jan 1 1970 00:00:00 UTC
. Entonces time.time()
devuelve el número de segundos desde la época.
la marca de tiempo siempre es hora en utc, pero cuando la llama datetime.datetime.fromtimestamp
devuelve la hora en su zona horaria local correspondiente a esta marca de tiempo, por lo que el resultado depende de su ubicación.
>>> 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)
Existe una buena biblioteca arrow
con diferentes comportamientos. En el mismo caso, devuelve su objeto de tiempo con la zona horaria 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]>