Dies gibt möglicherweise nicht die richtige Antwort. In den Dokumenten heißt es: "Beachten Sie, dass nicht alle Systeme die Zeit mit einer besseren Genauigkeit als 1 Sekunde liefern, obwohl die Zeit immer als Gleitkommazahl zurückgegeben wird"
Jason Polites,
11
Ich frage mich, warum müssen Sie round? Es scheint int(time.time() * 1000)genug zu sein?
Maxim Vladimirsky
14
IMO Ich würde Boden benutzen und nicht rund, aber das bin nur ich. Wenn jemand fragt, was die Stunde ist und es 7:32 ist, ist die Zahl, die er wahrscheinlich will, 7, nicht 8.
@ MaximVladimirsky Das ist nicht das Verhalten von int (). Int legt keinen Wert fest, sondern rundet auf Null. Welches ist das gleiche für positive Zahl, aber das Gegenteil für negative. int (1.5) ergibt 1, int (-1.5) ergibt -1, math.floor (-1.5) ergibt -2 Siehe: docs.python.org/2/library/stdtypes.html
Skip Huffman
91
time.time()kann nur die Sekunde auflösen, der bevorzugte Ansatz für Millisekunden ist datetime.
from datetime import datetime
dt = datetime.now()
dt.microsecond
+1, da dies der offizielle Weg ist, um einen zuverlässigen Zeitstempel vom System zu erhalten.
Pascal
16
-1. Dies ist eine falsche Antwort auf diese Frage. Wie @Boris kommentierte, gibt dies nicht "die Zeit in Mikrosekunden" an, z. B. nicht Tage, Stunden, Sekunden in Mikrosekunden.
Ja
3
+1 Dies ergibt einen korrekten Wert und es kann angenommen werden, dass Arithmetik funktioniert, weil Mathematik. Wenn der Benutzer die aktuelle Zeit in Millisekunden / Mikrosekunden benötigt, werden sie durch einfache Arithmetik dorthin gebracht. Wenn ein Zeitdelta benötigt wird - was nicht verlangt wird -, spart die Arithmetik wiederum den Tag.
Jack Stout
3
Gibt eine Mikrosekunde der aktuellen Zeit an, nicht den gesamten Zeitstempel.
Wenn Sie eine einfache Methode in Ihrem Code wünschen, die die Millisekunden mit datetime zurückgibt:
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
Dies ist der Unterschied zwischen zwei Mal in Millisekunden. Wenn Sie Ihre Methode mit der Antwort von @Jason kombinieren, erhalten Sie den aktuellen Zeitstempel in Millisekunden. start_timeWenn Sie darüber nachdenken , wäre der UNIX-Zeitstempel Ihre Methode mit = datetime (1970,1,1)
PR
Die Ortszeit kann mehrdeutig und nicht eintönig sein (aufgrund von DST-Übergängen oder anderen Gründen, um den lokalen UTC-Offset zu ändern). Verwenden Sie .utcnow()stattdessen oder wenn Sie nicht die absolute Zeit benötigen, können Sie verwenden time.monotonous(). Hinweis: Aufgrund der Gleitkomma-Arithmetik zwischen some_int + dt.microseconds/ 1000.0und der Formel ( ) / 10**3mit aktivierter wahrer Division gibt es einen geringfügigen Unterschied . Siehe die explizite Formel und den Link für total_seconds()in der entsprechenden Antwort
jfs
7
Der einfachste Weg, die aktuelle UTC-Zeit in Millisekunden zu ermitteln, ist:
Wenn Sie Bedenken haben, die verstrichene Zeit zu messen, sollten Sie die monotone Uhr (Python 3) verwenden . Diese Uhr wird nicht von Systemuhraktualisierungen beeinflusst, wie Sie beispielsweise sehen würden, wenn eine NTP-Abfrage Ihre Systemzeit anpasst.
>>>import time
>>> millis = round(time.monotonic()*1000)
Es gibt eine Referenzzeit in Sekunden an, die zum späteren Vergleichen zur Messung der verstrichenen Zeit verwendet werden kann.
Wenn Sie meinen Code (unten) verwenden, wird die Zeit in Sekunden und nach einer Dezimalstelle in Millisekunden angezeigt. Ich denke, dass es einen Unterschied zwischen Windows und Unix gibt - bitte kommentieren Sie, wenn es einen gibt.
Kein Unterschied unter Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn
1
Kein Unterschied unter Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn
1
Diese Multiplikationen auf 1000 für Millisekunden können zum Lösen oder Akzeptieren einer bestimmten Voraussetzung angemessen sein. Es könnte verwendet werden, um eine Lücke in Ihrer Datenbank zu füllen, die es nie wirklich benutzt. In realen Situationen, in denen ein genaues Timing erforderlich ist, würde dies jedoch letztendlich fehlschlagen. Ich würde niemandem empfehlen, diese Methode für geschäftskritische Operationen zu verwenden, für die Aktionen erforderlich sind, oder für die Verarbeitung zu bestimmten Zeitpunkten.
Zum Beispiel: Round-Trip-Pings sind in den USA 30-80 ms lang ... Sie können das nicht einfach aufrunden und effizient nutzen.
In meinem eigenen Beispiel sind Aufgaben pro Sekunde erforderlich. Wenn ich also nach der Beantwortung der ersten Aufgaben aufrunde, entsteht immer noch die Verarbeitungszeit multipliziert mit jedem Hauptschleifenzyklus. Dies war schließlich ein Gesamtfunktionsaufruf alle 60 Sekunden. das ist ~ 1440 pro Tag .. nicht zu genau.
Nur ein Gedanke für Leute, die nach genaueren Argumenten suchen, die über das Lösen einer Datenbanklücke hinausgehen, die sie nie wirklich nutzt.
import time; ms = time.time()*1000.0
time.time()
bietet möglicherweise eine schlechtere Genauigkeit alsdatetime.utcnow()
auf einigen Plattformen und Python-Versionen.Antworten:
Für das, was ich brauchte, habe ich Folgendes getan, basierend auf dem obigen Kommentar von @samplebias:
Schnell und einfach. Vielen Dank an alle, Entschuldigung für den Hirnfurz.
Zur Wiederverwendung:
Dann:
quelle
round
? Es scheintint(time.time() * 1000)
genug zu sein?.utcnow()
AnwendungenGetSystemTimeAsFileTime()
auf den letzten CPython unter Windows . Würdetime.clock()
call (QueryPerformanceCounter()
) nicht mehr Rauschen verursachen, als es reduzieren könnte? Siehe Präzision ist nicht gleich Genauigkeit .time.time()
kann nur die Sekunde auflösen, der bevorzugte Ansatz für Millisekunden istdatetime
.quelle
quelle
.total_seconds()
, um (möglicherweise) eine bessere Genauigkeit zu erzielen:(td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(mit aktivierter wahrer Division) Oder wenn Sie die Millisekunden abschneiden möchten, verwenden Sie// 10**3
.Ab Version 3.7 können Sie die
time.time_ns()
Zeit als vergangene Nanosekunden aus der Epoche abrufen. So können Sie tunZeit in Millisekunden als Ganzzahl zu erhalten.
quelle
Nur Beispielcode:
Ausgabe: 1534343781311
quelle
Eine andere Lösung ist die Funktion, die Sie in Ihre eigenen utils.py einbetten können
quelle
Wenn Sie eine einfache Methode in Ihrem Code wünschen, die die Millisekunden mit datetime zurückgibt:
quelle
start_time
Wenn Sie darüber nachdenken , wäre der UNIX-Zeitstempel Ihre Methode mit = datetime (1970,1,1).utcnow()
stattdessen oder wenn Sie nicht die absolute Zeit benötigen, können Sie verwendentime.monotonous()
. Hinweis: Aufgrund der Gleitkomma-Arithmetik zwischensome_int + dt.microseconds/ 1000.0
und der Formel( ) / 10**3
mit aktivierter wahrer Division gibt es einen geringfügigen Unterschied . Siehe die explizite Formel und den Link fürtotal_seconds()
in der entsprechenden AntwortDer einfachste Weg, die aktuelle UTC-Zeit in Millisekunden zu ermitteln, ist:
quelle
Wenn Sie Bedenken haben, die verstrichene Zeit zu messen, sollten Sie die monotone Uhr (Python 3) verwenden . Diese Uhr wird nicht von Systemuhraktualisierungen beeinflusst, wie Sie beispielsweise sehen würden, wenn eine NTP-Abfrage Ihre Systemzeit anpasst.
Es gibt eine Referenzzeit in Sekunden an, die zum späteren Vergleichen zur Messung der verstrichenen Zeit verwendet werden kann.
quelle
Wenn Sie meinen Code (unten) verwenden, wird die Zeit in Sekunden und nach einer Dezimalstelle in Millisekunden angezeigt. Ich denke, dass es einen Unterschied zwischen Windows und Unix gibt - bitte kommentieren Sie, wenn es einen gibt.
Mein Ergebnis (unter Windows) war:
EDIT : Es gibt keinen Unterschied :) Danke tc0nn
quelle
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
Diese Multiplikationen auf 1000 für Millisekunden können zum Lösen oder Akzeptieren einer bestimmten Voraussetzung angemessen sein. Es könnte verwendet werden, um eine Lücke in Ihrer Datenbank zu füllen, die es nie wirklich benutzt. In realen Situationen, in denen ein genaues Timing erforderlich ist, würde dies jedoch letztendlich fehlschlagen. Ich würde niemandem empfehlen, diese Methode für geschäftskritische Operationen zu verwenden, für die Aktionen erforderlich sind, oder für die Verarbeitung zu bestimmten Zeitpunkten.
Zum Beispiel: Round-Trip-Pings sind in den USA 30-80 ms lang ... Sie können das nicht einfach aufrunden und effizient nutzen.
In meinem eigenen Beispiel sind Aufgaben pro Sekunde erforderlich. Wenn ich also nach der Beantwortung der ersten Aufgaben aufrunde, entsteht immer noch die Verarbeitungszeit multipliziert mit jedem Hauptschleifenzyklus. Dies war schließlich ein Gesamtfunktionsaufruf alle 60 Sekunden. das ist ~ 1440 pro Tag .. nicht zu genau.
Nur ein Gedanke für Leute, die nach genaueren Argumenten suchen, die über das Lösen einer Datenbanklücke hinausgehen, die sie nie wirklich nutzt.
quelle
Nur eine weitere Lösung mit dem
datetime
Modul für Python 3.quelle