Esto puede no dar la respuesta correcta. Según los documentos, "Tenga en cuenta que aunque el tiempo siempre se devuelve como un número de coma flotante, no todos los sistemas proporcionan el tiempo con una precisión mejor que 1 segundo"
Jason Polites
11
Me pregunto, ¿por qué lo necesitas round? Parece que int(time.time() * 1000)es suficiente?
Maxim Vladimirsky
14
En mi opinión, usaría piso y no redondo, pero solo soy yo. Si alguien pregunta qué hora es, y son las 7:32, el número que probablemente quieran es 7, no 8.
@MaximVladimirsky Ese no es el comportamiento de int (). Int no pone un valor en el piso, se redondea hacia cero. Lo que es lo mismo para el número positivo, pero lo contrario para el negativo. int (1.5) da 1, int (-1.5) da -1, math.floor (-1.5) da -2 Ver: docs.python.org/2/library/stdtypes.html
Skip Huffman
91
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
+1 porque esta es la forma oficial de obtener una marca de tiempo confiable del sistema.
Pascal
16
-1. Esta es una respuesta incorrecta a esta pregunta. como comentó @Boris, esto no da "el tiempo en microsegundos", por ejemplo, no incluye días, horas, segundos en número de microsegundos.
ja
3
+1 Esto da un valor correcto y se puede suponer que la aritmética funciona porque las matemáticas. Si el usuario necesita el tiempo actual en milisegundos / microsegundos, la simple aritmética los llevará allí. Si se necesita un delta de tiempo, que no se solicita, la aritmética, nuevamente, salva el día.
Jack Stout
3
Da microsegundos de la hora actual, no la marca de tiempo completa.
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 programdef millis():
dt = datetime.now()- start_time
ms =(dt.days *24*60*60+ dt.seconds)*1000+ dt.microseconds /1000.0return ms
esta es la diferencia entre dos veces en milisegundos, combinando su método con la respuesta de @Jason da la marca de tiempo actual en milisegundos ... Pensando en ello, la marca de tiempo UNIX sería su método con start_time= datetime (1970,1,1)
PR
la hora local puede ser ambigua y no monótona (debido a las transiciones de horario de verano u otras razones para cambiar el desplazamiento de utc local). Use en su .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.0y la fórmula ( ) / 10**3con la división verdadera habilitada. Consulte la fórmula explícita y el enlace para total_seconds()en la respuesta relacionada
jfs
7
La forma más simple que he encontrado para obtener el tiempo UTC actual en milisegundos es:
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.
No diff en Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn
1
No diff en Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn
1
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
time.time()
puede proporcionar una precisión peor quedatetime.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:
Rápido y fácil. Gracias a todos, perdón por el pedo cerebral.
Para reutilizar:
Entonces:
fuente
round
? Parece queint(time.time() * 1000)
es suficiente?.utcnow()
usosGetSystemTimeAsFileTime()
en CPython reciente en Windows . ¿Notime.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 esdatetime
.fuente
fuente
.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 hacerpara obtener tiempo en milisegundos como entero.
fuente
Solo muestra el código:
Salida: 1534343781311
fuente
Otra solución es la función que puede integrar en su propia utilidad.
fuente
Si desea un método simple en su código que devuelva los milisegundos con fecha y hora:
fuente
start_time
= datetime (1970,1,1).utcnow()
lugar o si no necesita el tiempo absoluto, entonces podría usartime.monotonous()
. Nota: existe una sutil diferencia debido a la aritmética de punto flotante entresome_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 paratotal_seconds()
en la respuesta relacionadaLa forma más simple que he encontrado para obtener el tiempo UTC actual en milisegundos es:
fuente
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.
Proporciona un tiempo de referencia en segundos que se puede usar para comparar más tarde y medir el tiempo transcurrido.
fuente
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.
mi resultado (en Windows) fue:
EDITAR : No hay diferencia :) Gracias tc0nn
fuente
/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.
fuente
Solo otra solución usando el
datetime
módulo para Python 3.fuente