¿Hora actual en milisegundos en Python?

532

¿Cómo puedo obtener la hora actual en milisegundos en Python?

Naftuli Kay
fuente
67
import time; ms = time.time()*1000.0
samplebias
44
@samplebias: time.time()puede proporcionar una precisión peor que datetime.utcnow()en algunas plataformas y versiones de Python.
jfs
55
¿En milisegundos desde cuándo ? Si quiere decir desde la época (medianoche 1 de enero de 1970 UTC), vea esto: stackoverflow.com/questions/18169099/…
Michael Scheper
2
Para ver las verdaderas marcas de tiempo de milisegundos de resolución en microsegundos, consulte aquí: stackoverflow.com/questions/38319606/…
Gabriel Staples

Respuestas:

713

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
Naftuli Kay
fuente
34
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.
davr
1
@ParallelUniverse: .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 .
jfs
10
@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
Jason Polites
fuente
94
no del todo útil: esto solo le da los microsegundos dentro del segundo dt ver stackoverflow.com/a/1905423/74632
Boris Chervenkov el
8
+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.
kawadhiya21
35

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.

zardosht
fuente
Esto funcionó mejor para mí (Python 3.7.6)
Paul Watson
22

Solo muestra el código:

import time
timestamp = int(time.time()*1000.0)

Salida: 1534343781311

Wilson Wu
fuente
13

Otra solución es la función que puede integrar en su propia utilidad.

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))
Cadey
fuente
12

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
Pascal
fuente
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:

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()
Laymain
fuente
7

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.

Phord
fuente
4

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

PythonMaster202
fuente
1
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.

Mike Guidry
fuente
2
¿Tienes una mejor solución? También honestamente, no entiendo lo que estás diciendo en absoluto. ¿Qué quieres decir con "redondear"?
Noche
2
Explique su solución con un ejemplo práctico para una mejor comprensión
Ratan Uday Kumar
0

Solo otra solución usando el datetimemódulo para Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Vikas
fuente