¿Cómo puedo obtener la hora actual en milisegundos en Python?
time.time()
puede proporcionar una precisión peor que datetime.utcnow()
en algunas plataformas y versiones de Python.
¿Cómo puedo obtener la hora actual en milisegundos en Python?
time.time()
puede proporcionar una precisión peor que datetime.utcnow()
en algunas plataformas y versiones de Python.
Respuestas:
Para lo que necesitaba, esto es lo que hice, basado en el comentario anterior de @samplebias:
import time
millis = int(round(time.time() * 1000))
print millis
Rápido y fácil. Gracias a todos, perdón por el pedo cerebral.
Para reutilizar:
import time
current_milli_time = lambda: int(round(time.time() * 1000))
Entonces:
>>> current_milli_time()
1378761833768
round
? Parece que int(time.time() * 1000)
es suficiente?
.utcnow()
usos GetSystemTimeAsFileTime()
en CPython reciente en Windows . ¿No time.clock()
llamaría ( QueryPerformanceCounter()
) a introducir más ruido del que podría reducir? Ver precisión no es lo mismo que precisión .
time.time()
solo puede dar resolución al segundo, el enfoque preferido para milisegundos es datetime
.
from datetime import datetime
dt = datetime.now()
dt.microsecond
def TimestampMillisec64():
return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000)
.total_seconds()
producir (posiblemente) una mejor precisión: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(con división verdadera habilitada) O si desea truncar los milisegundos, use // 10**3
.
A partir de la versión 3.7 , puede usar time.time_ns()
para obtener el tiempo a medida que pasan los nano segundos de la época. Entonces puedes hacer
ms = time.time_ns() // 1000000
para obtener tiempo en milisegundos como entero.
Si desea un método simple en su código que devuelva los milisegundos con fecha y hora:
from datetime import datetime
from datetime import timedelta
start_time = datetime.now()
# returns the elapsed milliseconds since the start of the program
def millis():
dt = datetime.now() - start_time
ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
return ms
start_time
= datetime (1970,1,1)
.utcnow()
lugar o si no necesita el tiempo absoluto, entonces podría usar time.monotonous()
. Nota: existe una sutil diferencia debido a la aritmética de punto flotante entre some_int + dt.microseconds/ 1000.0
y la fórmula ( ) / 10**3
con la división verdadera habilitada. Consulte la fórmula explícita y el enlace para total_seconds()
en la respuesta relacionada
Si le preocupa medir el tiempo transcurrido, debe usar el reloj monotónico (python 3) . Este reloj no se ve afectado por las actualizaciones del reloj del sistema, como vería si una consulta NTP ajustara la hora de su sistema, por ejemplo.
>>> import time
>>> millis = round(time.monotonic() * 1000)
Proporciona un tiempo de referencia en segundos que se puede usar para comparar más tarde y medir el tiempo transcurrido.
Si usa mi código (abajo), el tiempo aparecerá en segundos, luego, después de un decimal, milisegundos. Creo que hay una diferencia entre Windows y Unix, por favor comente si la hay.
from time import time
x = time()
print(x)
mi resultado (en Windows) fue:
1576095264.2682993
EDITAR : No hay diferencia :) Gracias tc0nn
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
Estas multiplicaciones a 1000 por milisegundos pueden ser decentes para resolver o hacer aceptable algún requisito previo. Podría usarse para llenar un vacío en su base de datos que realmente nunca lo usa. Sin embargo, para situaciones reales que requieren una sincronización precisa, finalmente fallaría. No sugeriría a nadie que use este método para operaciones de misión crítica que requieren acciones o procesamiento en momentos específicos.
Por ejemplo: los pings de ida y vuelta son 30-80ms en los EE. UU. ... No podría simplemente redondear eso y usarlo de manera eficiente.
Mi propio ejemplo requiere tareas a cada segundo, lo que significa que si redondeo después de que responden las primeras tareas, aún incurriría en el tiempo de procesamiento multiplicado en cada ciclo del ciclo principal. Esto terminó siendo una llamada de función total cada 60 segundos. eso es ~ 1440 al día ... no demasiado preciso.
Solo una idea para las personas que buscan un razonamiento más preciso más allá de resolver un vacío en la base de datos que realmente nunca lo usa.
import time; ms = time.time()*1000.0