Ricevi l'ora corrente in millisecondi in Python?


532

Come posso ottenere l'ora corrente in millisecondi in Python?


67
import time; ms = time.time()*1000.0
samplebias

4
@samplebias: time.time()potrebbe fornire una precisione peggiore rispetto datetime.utcnow()ad alcune piattaforme e versioni di Python.
jfs

5
In millisecondi da quando ? Se intendi dall'epoca (mezzanotte del 1 gennaio 1970 UTC), vedi questo: stackoverflow.com/questions/18169099/…
Michael Scheper,

2
Per i timestamp in millisecondi con risoluzione dei microsecondi reali, vedere qui: stackoverflow.com/questions/38319606/…
Gabriel Staples,

Risposte:


711

Per quello che mi serviva, ecco cosa ho fatto, basandomi sul commento di @samplebias sopra:

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

Quick'n'easy. Grazie a tutti, scusate la scoreggia cerebrale.

Per il riutilizzo:

import time

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

Poi:

>>> current_milli_time()
1378761833768

34
Questo potrebbe non dare la risposta corretta. Secondo i documenti, "Nota che anche se il tempo viene sempre restituito come un numero in virgola mobile, non tutti i sistemi forniscono un tempo con una precisione migliore di 1 secondo"
Jason Polites,

11
Mi chiedo, perché è necessario round? Sembra int(time.time() * 1000)abbastanza?
Maxim Vladimirsky,

14
IMO userei il pavimento e non il giro, ma sono solo io. Se qualcuno chiede qual è l'ora, ed è 7:32, il numero che probabilmente vogliono è 7, non 8.
davr

1
@ParallelUniverse: .utcnow()utilizza GetSystemTimeAsFileTime()su CPython recente su Windows . Non sarebbe time.clock()chiamare ( QueryPerformanceCounter()) introdurre più rumore di quanto potrebbe ridurre? Vedi La precisione non è la stessa della precisione .
jfs,

10
@MaximVladimirsky Questo non è il comportamento di int (). Int non inserisce un valore al piano, arrotondando verso zero. Che è la stessa cosa per il numero positivo, ma il contrario per il negativo. int (1.5) dà 1, int (-1.5) dà -1, math.floor (-1.5) dà -2 Vedi: docs.python.org/2/library/stdtypes.html
Skip Huffman

91

time.time()può solo dare una soluzione al secondo, l'approccio preferito per i millisecondi è datetime.

from datetime import datetime
dt = datetime.now()
dt.microsecond

94
non abbastanza utile - questo ti dà solo i microsecondi entro il secondo di dt. vedi stackoverflow.com/a/1905423/74632
Boris Chervenkov

8
+1 perché questo è il modo ufficiale per ottenere un timestamp affidabile dal sistema.
Pascal,

16
-1. questa è una risposta errata a questa domanda. come ha commentato @Boris, questo non indica "il tempo in microsecondi", ad esempio non include giorni, ore, secondi nel numero di microsecondi.
ja

3
+1 Questo fornisce un valore corretto e si può presumere che l'aritmetica funzioni a causa della matematica. Se l'utente ha bisogno dell'ora corrente in millisecondi / microsecondi, l'aritmetica semplice li porterà lì. Se è necessario un delta temporale - che non è richiesto - l'aritmetica, di nuovo, salva la giornata.
Jack Stout,

3
Fornisce il microsecondo dell'ora corrente, non l'intero timestamp.
kawadhiya21,


35

Dalla versione 3.7 è possibile utilizzare time.time_ns()per ottenere il tempo trascorso nano secondi dall'epoca. Quindi puoi farlo

ms = time.time_ns() // 1000000 

per ottenere il tempo in mili-secondi come numero intero.


Questo ha funzionato meglio per me (Python 3.7.6)
Paul Watson il

22

Basta un codice di esempio:

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

Uscita: 1534343781311


13

un'altra soluzione è la funzione che puoi incorporare nel tuo utils.py

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

12

Se si desidera un metodo semplice nel codice che restituisca i millisecondi con datetime:

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

questa è la differenza tra due volte in millisecondi, combinando il tuo metodo con la risposta di @Jason fornisce il timestamp corrente in millisecondi ... Pensandoci, il timestamp UNIX sarebbe il tuo metodo con start_time= datetime (1970,1,1)
PR

l'ora locale può essere ambigua e non monotona (a causa delle transizioni dell'ora legale o di altri motivi per modificare l'offset utc locale). Utilizzare .utcnow()invece o se non è necessario il tempo assoluto, quindi è possibile utilizzare time.monotonous(). Nota: c'è una sottile differenza dovuta all'aritmetica in virgola mobile tra some_int + dt.microseconds/ 1000.0e la formula ( ) / 10**3con la divisione vera abilitata. Vedi la formula esplicita e il link per total_seconds()nella relativa risposta
jfs

7

Il modo più semplice che ho trovato per ottenere l'ora UTC corrente in millisecondi è:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Se sei preoccupato di misurare il tempo trascorso, dovresti usare l' orologio monotonico (python 3) . Questo orologio non è influenzato dagli aggiornamenti dell'orologio di sistema come vedresti se, ad esempio, una query NTP aggiusta l'ora di sistema.

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

Fornisce un tempo di riferimento in secondi che può essere utilizzato per confrontare in seguito per misurare il tempo trascorso.


4

Se usi il mio codice (sotto), il tempo apparirà in secondi, quindi, dopo un decimale, millisecondi. Penso che ci sia una differenza tra Windows e Unix - per favore commenta se c'è.

from time import time

x = time()
print(x)

il mio risultato (su Windows) è stato:

1576095264.2682993

EDIT : Non c'è differenza :) Grazie tc0nn


1
Nessuna differenza su Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Nessuna differenza su Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

Queste moltiplicazioni a 1000 per millisecondi possono essere decenti per risolvere o rendere accettabili alcuni prerequisiti. Potrebbe essere utilizzato per colmare una lacuna nel database che non lo utilizza mai. Anche se, per situazioni reali che richiedono un tempismo preciso, alla fine fallirebbe. Non consiglierei a nessuno di usare questo metodo per operazioni mission-critical che richiedono azioni o elaborazioni a tempi specifici.

Ad esempio: ping di andata e ritorno di 30-80 ms negli Stati Uniti ... Non si può semplicemente arrotondare per eccesso e usarlo in modo efficiente.

Il mio esempio richiede attività ad ogni secondo, il che significa che se arrotondassi dopo la risposta delle prime attività continuerei a sostenere il tempo di elaborazione moltiplicato per ogni ciclo di ciclo principale. Questo finiva per essere una chiamata di funzione totale ogni 60 secondi. questo è ~ 1440 al giorno .. non troppo preciso.

Solo un pensiero per le persone che cercano un ragionamento più accurato oltre a risolvere un gap del database che non lo utilizza mai realmente.


2
hai una soluzione migliore? Onestamente, non capisco proprio quello che stai dicendo. Cosa intendi con "arrotondamento"?
Imperishable Night,

2
Spiega la tua soluzione con un esempio pratico per una migliore comprensione
Ratan Uday Kumar il

0

Solo un'altra soluzione che utilizza il datetimemodulo per Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.