Aktuelle Zeit in Millisekunden in Python abrufen?

532

Wie kann ich die aktuelle Zeit in Millisekunden in Python abrufen?

Naftuli Kay
quelle
67
import time; ms = time.time()*1000.0
samplebias
4
@samplebias: time.time()bietet möglicherweise eine schlechtere Genauigkeit als datetime.utcnow()auf einigen Plattformen und Python-Versionen.
JFS
5
In Millisekunden seit wann ? Wenn Sie seit der Epoche (Mitternacht, 1. Januar 1970 UTC) meinen, sehen Sie dies: stackoverflow.com/questions/18169099/…
Michael Scheper
2
Für echte Millisekunden-Zeitstempel mit einer Auflösung von Mikrosekunden siehe hier: stackoverflow.com/questions/38319606/…
Gabriel Staples

Antworten:

710

Für das, was ich brauchte, habe ich Folgendes getan, basierend auf dem obigen Kommentar von @samplebias:

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

Schnell und einfach. Vielen Dank an alle, Entschuldigung für den Hirnfurz.

Zur Wiederverwendung:

import time

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

Dann:

>>> current_milli_time()
1378761833768
Naftuli Kay
quelle
34
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.
Davr
1
@ParallelUniverse: .utcnow()Anwendungen GetSystemTimeAsFileTime()auf den letzten CPython unter Windows . Würde time.clock()call ( QueryPerformanceCounter()) nicht mehr Rauschen verursachen, als es reduzieren könnte? Siehe Präzision ist nicht gleich Genauigkeit .
JFS
10
@ 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
Jason Polites
quelle
94
nicht ganz nützlich - dies gibt Ihnen nur die Mikrosekunden innerhalb der Sekunde des dt. siehe stackoverflow.com/a/1905423/74632
Boris
8
+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.
kawadhiya21
48
def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 
user3324131
quelle
3
Sie können die Formel einfügen .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.
JFS
1
Dies scheint die beste Antwort zu sein, wenn Sie datetime verwenden
dlsso
35

Ab Version 3.7 können Sie die time.time_ns()Zeit als vergangene Nanosekunden aus der Epoche abrufen. So können Sie tun

ms = time.time_ns() // 1000000 

Zeit in Millisekunden als Ganzzahl zu erhalten.

zardosht
quelle
Dies funktionierte am besten für mich (Python 3.7.6)
Paul Watson
22

Nur Beispielcode:

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

Ausgabe: 1534343781311

Wilson Wu
quelle
13

Eine andere Lösung ist die Funktion, die Sie in Ihre eigenen utils.py einbetten können

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

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 program
def millis():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms
Pascal
quelle
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:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()
Laie
quelle
7

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.

Phord
quelle
4

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.

from time import time

x = time()
print(x)

Mein Ergebnis (unter Windows) war:

1576095264.2682993

EDIT : Es gibt keinen Unterschied :) Danke tc0nn

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

Mike Guidry
quelle
2
Hast du eine bessere Lösung? Auch ehrlich gesagt verstehe ich überhaupt nicht, was Sie sagen. Was meinst du mit "aufrunden"?
Unverderbliche Nacht
2
Erklären Sie Ihre Lösung mit einem praktischen Beispiel zum besseren Verständnis
Ratan Uday Kumar
0

Nur eine weitere Lösung mit dem datetimeModul für Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Vikas
quelle