Obter tempo atual em milissegundos em Python?

532

Como posso obter o horário atual em milissegundos em Python?

Naftuli Kay
fonte
67
import time; ms = time.time()*1000.0
Samplebias
4
@ samplebias: time.time()pode fornecer uma precisão pior do que datetime.utcnow()em algumas plataformas e versões python.
JFS
5
Em milissegundos desde quando ? Se você quer dizer desde a época (meia-noite de 1 de janeiro de 1970, UTC), veja o seguinte: stackoverflow.com/questions/18169099/…
Michael Scheper
2
Para milissegundos verdadeiros microssegundo de resolução de selos de tempo ver aqui: stackoverflow.com/questions/38319606/...
Gabriel Staples

Respostas:

710

Para o que eu precisava, aqui está o que eu fiz, com base no comentário de @samplebias acima:

import time
millis = int(round(time.time() * 1000))
print millis

Rápido e fácil. Obrigado a todos, desculpe pelo peido do cérebro.

Para reutilização:

import time

current_milli_time = lambda: int(round(time.time() * 1000))

Então:

>>> current_milli_time()
1378761833768
Naftuli Kay
fonte
34
Isso pode não dar a resposta correta. De acordo com a documentação, "Nota que, apesar do tempo é sempre retornado como um número de ponto flutuante, nem todos os sistemas fornecem o tempo com uma precisão melhor do que 1 segundo"
Jason Polites
11
Estou me perguntando, por que você precisa round? Parece que int(time.time() * 1000)é o suficiente?
Maxim Vladimirsky
14
OMI eu usaria chão e não redondo, mas sou apenas eu. Se alguém perguntar o que é chegada a hora, e é 7:32, o número provavelmente eles querem é 7, não 8.
davr
1
@ParallelUniverse: .utcnow()usa GetSystemTimeAsFileTime()no CPython recente no Windows . Não iria time.clock()ligar para ( QueryPerformanceCounter()) introduzir mais ruído do que poderia reduzir? Ver Precisão não é o mesmo que precisão .
precisa saber é
10
@MaximVladimirsky Esse não é o comportamento de int (). Int não calcula um valor, ele arredonda para zero. O que é o mesmo para o número positivo, mas o oposto para o negativo. int (1.5) dá 1, int (-1,5) dá -1, Math.floor (-1,5) dá -2 Ver: docs.python.org/2/library/stdtypes.html
Ir Huffman
91

time.time()pode apenas dar resolução ao segundo, a abordagem preferida por milissegundos é datetime.

from datetime import datetime
dt = datetime.now()
dt.microsecond
Jason Polites
fonte
94
não é muito útil - isso fornece apenas os microssegundos dentro do segundo da dt. Veja stackoverflow.com/a/1905423/74632
Boris Chervenkov
8
+1 porque esta é a maneira oficial de obter um carimbo de data / hora confiável do sistema.
Pascal
16
-1. esta é uma resposta incorreta para esta pergunta. como o @Boris comentou, isso não indica "o tempo em microssegundos", por exemplo, não inclui dias, horas, segundos no número de microssegundos.
ja
3
+1 Isso fornece um valor correto e pode-se presumir que a aritmética funcione devido à matemática. Se o usuário precisar do tempo atual em milissegundos / microssegundos, a aritmética simples os levará até lá. Se um delta de tempo é necessário - o que não é solicitado -, a aritmética salva novamente o dia.
Jack Stout
3
Fornece microssegundo do horário atual, não o carimbo de data / hora inteiro.
precisa saber é o seguinte
35

A partir da versão 3.7, você pode usar time.time_ns()para obter tempo como nano segundos passados ​​da época. Então você pode fazer

ms = time.time_ns() // 1000000 

para obter tempo em mili-segundos como inteiro.

zardosht
fonte
Funcionou melhor para mim (Python 3.7.6)
Paul Watson
22

Apenas código de exemplo:

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

Saída: 1534343781311

Wilson Wu
fonte
13

Outra solução é a função que você pode incorporar nos seus próprios utils.py

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

Se você deseja um método simples no seu código que retorne os milissegundos com data e 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
fonte
esta é a diferença entre duas vezes em milissegundos, combinando seu método com a resposta de @Jason fornece o registro de data e hora atual em milissegundos ... Pensando nisso, o registro de data e hora do UNIX seria seu método com start_time= datetime (1970,1,1)
PR
a hora local pode ser ambígua e não monótona (devido a transições de horário de verão ou outros motivos para alterar o deslocamento utc local). Use em .utcnow()vez disso ou se você não precisar do tempo absoluto, poderá usá-lo time.monotonous(). Nota: há uma diferença sutil devido à aritmética de ponto flutuante entre some_int + dt.microseconds/ 1000.0e a fórmula ( ) / 10**3com a divisão verdadeira ativada. Veja a fórmula explícita e o link para total_seconds()na resposta relacionada
jfs
7

A maneira mais simples de encontrar a hora atual do UTC em milissegundos é:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()
Laymain
fonte
7

Se você estiver preocupado em medir o tempo decorrido, use o relógio monotônico (python 3) . Esse relógio não é afetado pelas atualizações do relógio do sistema, como você veria se uma consulta NTP ajustasse a hora do sistema, por exemplo.

>>> import time
>>> millis = round(time.monotonic() * 1000)

Ele fornece um tempo de referência em segundos que pode ser usado para comparar posteriormente para medir o tempo decorrido.

frase
fonte
4

Se você usar meu código (abaixo), o tempo aparecerá em segundos e, depois de um decimal, milissegundos. Eu acho que existe uma diferença entre o Windows e o Unix - por favor, comente se houver.

from time import time

x = time()
print(x)

meu resultado (no Windows) foi:

1576095264.2682993

EDIT : Não há diferença :) Obrigado tc0nn

PythonMaster202
fonte
1
Não há diferenças no Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn
1
No diff no Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn
1

Essas multiplicações para 1.000 por milissegundos podem ser decentes para resolver ou tornar aceitável algum pré-requisito. Pode ser usado para preencher uma lacuna no seu banco de dados que realmente nunca o utiliza. Embora, para situações reais que exijam um timing preciso, acabaria por falhar. Eu não sugeriria que alguém usasse esse método para operações de missão crítica que exigem ações ou processamento em horários específicos.

Por exemplo: pings de ida e volta sendo de 30 a 80ms nos EUA ... Você não pode simplesmente arredondar isso e usá-lo com eficiência.

Meu próprio exemplo requer tarefas a cada segundo, o que significa que, se eu arredondar para cima após a resposta das primeiras tarefas, ainda incorrerei no tempo de processamento multiplicado a cada ciclo do loop principal. Isso acabou sendo uma chamada de função total a cada 60 segundos. isso é ~ 1440 por dia .. não é muito preciso.

Apenas um pensamento para as pessoas que procuram um raciocínio mais preciso, além de solucionar uma lacuna no banco de dados que nunca a utiliza de verdade.

Mike Guidry
fonte
2
Você tem uma solução melhor? Também honestamente, eu não entendo o que você está dizendo. O que você quer dizer com "arredondar para cima"?
Noite imperecível
2
Explique sua solução com um exemplo prático para uma melhor compreensão
Ratan Uday Kumar
0

Apenas outra solução usando o datetimemódulo para Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Vikas
fonte