@ 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/…
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.
@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
+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.
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 programdef millis():
dt = datetime.now()- start_time
ms =(dt.days *24*60*60+ dt.seconds)*1000+ dt.microseconds /1000.0return ms
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 é:
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.
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.
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.
import time; ms = time.time()*1000.0
time.time()
pode fornecer uma precisão pior do quedatetime.utcnow()
em algumas plataformas e versões python.Respostas:
Para o que eu precisava, aqui está o que eu fiz, com base no comentário de @samplebias acima:
Rápido e fácil. Obrigado a todos, desculpe pelo peido do cérebro.
Para reutilização:
Então:
fonte
round
? Parece queint(time.time() * 1000)
é o suficiente?.utcnow()
usaGetSystemTimeAsFileTime()
no CPython recente no Windows . Não iriatime.clock()
ligar para (QueryPerformanceCounter()
) introduzir mais ruído do que poderia reduzir? Ver Precisão não é o mesmo que precisão .time.time()
pode apenas dar resolução ao segundo, a abordagem preferida por milissegundos édatetime
.fonte
fonte
.total_seconds()
produzir (possivelmente) melhor precisão:(td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(com a divisão verdadeira ativada) Ou, se desejar truncar os milissegundos, use// 10**3
.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 fazerpara obter tempo em mili-segundos como inteiro.
fonte
Apenas código de exemplo:
Saída: 1534343781311
fonte
Outra solução é a função que você pode incorporar nos seus próprios utils.py
fonte
Se você deseja um método simples no seu código que retorne os milissegundos com data e hora:
fonte
start_time
= datetime (1970,1,1).utcnow()
vez disso ou se você não precisar do tempo absoluto, poderá usá-lotime.monotonous()
. Nota: há uma diferença sutil devido à aritmética de ponto flutuante entresome_int + dt.microseconds/ 1000.0
e a fórmula( ) / 10**3
com a divisão verdadeira ativada. Veja a fórmula explícita e o link paratotal_seconds()
na resposta relacionadaA maneira mais simples de encontrar a hora atual do UTC em milissegundos é:
fonte
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.
Ele fornece um tempo de referência em segundos que pode ser usado para comparar posteriormente para medir o tempo decorrido.
fonte
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.
meu resultado (no Windows) foi:
EDIT : Não há diferença :) Obrigado tc0nn
fonte
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
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.
fonte
Apenas outra solução usando o
datetime
módulo para Python 3.fonte