HOWTO · Python

Python-datetime mit Millisekunden in einen String umwandeln

Wandle ein Python-datetime-Objekt in einen ISO-String oder ein benutzerdefiniertes Format mit genau drei Millisekundenziffern um.

Auf dieser Seite

Verwenden Sie value.isoformat(timespec="milliseconds"), wenn ein ISO-artiges Ergebnis passt. Verwenden Sie strftime() mit %f und entfernen Sie die letzten drei Stellen, wenn Sie ein eigenes Layout benötigen. Beide Ansätze kürzen Mikrosekunden auf Millisekunden, statt sie zu runden.

Die Formatierung ändert die Darstellung, nicht den datetime-Wert selbst. Die Beispiele nutzen feste Eingaben, damit sich die Ausgabe exakt prüfen lässt; ersetzen Sie diese Konstruktoren durch einen Wert aus Ihrer Anwendung, nachdem Sie das benötigte Layout gewählt haben. Wenn das empfangende System einen Offset erwartet, machen Sie den Wert vor dem Formatieren zeitzonenbewusst.

Verwenden Sie isoformat() für dreistellige Millisekundenpräzision

datetime.isoformat() ist die klarste Wahl für einen ISO-8601-artigen String. Das Argument timespec="milliseconds" gibt immer genau drei Nachkommastellen für Sekunden aus. Es ist ab Python 3.6 verfügbar.

Übergeben Sie exakt den kleingeschriebenen Plural-String "milliseconds". Andere unterstützte timespec-Werte wählen andere Genauigkeiten, während ein unbekannter Wert ValueError auslöst. Dieser ausdrückliche Parameter ist besser als das Standardverhalten "auto", wenn ein nachgelagertes Schema eine konstante Feldbreite verlangt.

Das folgende deterministische Beispiel verwendet ein zeitzonenbewusstes datetime, sodass das Ergebnis auch zeigt, dass isoformat() den UTC-Offset beibehält:

"""Show the recommended ISO-style millisecond formatting behavior."""

from datetime import datetime, timezone


value = datetime(2026, 9, 16, 12, 34, 56, 789654, tzinfo=timezone.utc)
print(value.isoformat(timespec="milliseconds"))

Ausgabe:

2026-09-16T12:34:56.789+00:00

Der sechsstellige microsecond-Wert 789654 wird zu .789. Python rundet den Wert nicht auf .790; timespec steuert, welche Bestandteile erscheinen, und ausgelassene Zeitbestandteile werden abgeschnitten.

Verwenden Sie ein zeitzonenbewusstes datetime, wenn der String systemübergreifend einen tatsächlichen Zeitpunkt identifizieren muss. Ein naiver Wert besitzt keinen UTC-Offset, sodass sein formatierter Text allein keine lokale Zeit von UTC oder einer anderen Zone unterscheiden kann.

isoformat() behält den bereits am Objekt gespeicherten Offset bei; es konvertiert den Wert nicht nach UTC. Normalisieren Sie das datetime vorher, wenn Ihr Datenvertrag UTC verlangt. Lassen Sie die Zeitzonenkonvertierung nur weg, wenn der Verbraucher ausdrücklich eine lokale Wanduhrzeit erwartet.

Verwenden Sie strftime() für ein eigenes Layout

Verwenden Sie strftime(), wenn Sie Reihenfolge, Trennzeichen oder andere Felder steuern müssen. Die Direktive %f erzeugt sechs Mikrosekundenziffern. Das Slicing mit [:-3] entfernt absichtlich die letzten drei Ziffern und lässt Millisekundenpräzision übrig:

"""Show millisecond precision in a custom datetime string format."""

from datetime import datetime


value = datetime(2026, 9, 16, 12, 34, 56, 789654)
print(value.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])

Ausgabe:

2026-09-16 12:34:56.789

Dieses Slicing ist sicher, weil %f immer ein mit Nullen aufgefülltes sechsstelliges Feld liefert, auch wenn der ursprüngliche Wert keine Mikrosekunden hat. Lassen Sie .%f vor [:-3] am Ende des Formats stehen; andernfalls könnte der Slice Zeichen aus einem anderen Feld entfernen.

Die Operation schneidet ab, statt zu runden. Zum Beispiel werden 789999 Mikrosekunden weiterhin zu 789 Millisekunden. Wenn eine Spezifikation Rundung verlangt, runden Sie das datetime vor dem Formatieren und behandeln Sie einen möglichen Übertrag in die nächste Sekunde; einfaches Slicing von %f kann diese Regel nicht umsetzen.

Der Importstil bestimmt, wie Sie die Klasse aufrufen. Mit from datetime import datetime rufen Sie datetime.now() auf. Wenn Sie stattdessen import datetime schreiben, rufen Sie datetime.datetime.now() auf.

Verstehen Sie str() und Slicing-Grenzen

Ein schlichtes str(value) entspricht value.isoformat(" "). Das standardmäßige timespec="auto" lässt das Nachkommafeld weg, wenn microsecond null ist, und gibt sonst alle sechs Mikrosekundenziffern aus. Daher garantiert str(value) kein dreistelliges Millisekundenfeld, und blindes [:-3] ist unsicher.

Dieses Verhalten mit variabler Breite ist für informelle Anzeige nützlich, aber für ein Feld mit fester Breite ungeeignet. Eine Prüfung auf einen Dezimalpunkt vor dem Slicing würde zwar verhindern, dass Sekunden beschädigt werden, sie würde aber Logik duplizieren, die isoformat(timespec="milliseconds") bereits übernimmt, und zusätzliche Vorsicht bei Zeitzonensuffixen erfordern.

Dieses Grenzbeispiel zeigt außerdem, dass Millisekundenausgabe bei 999999 Mikrosekunden abgeschnitten wird und dass der Singularwert "millisecond" ungültig ist:

"""Expose truncation, zero-microsecond slicing, and invalid-timespec boundaries."""

from datetime import datetime


almost_next_second = datetime(2026, 9, 16, 12, 34, 56, 999999)
without_fraction = datetime(2026, 9, 16, 12, 34, 56)

print(almost_next_second.isoformat(timespec="milliseconds"))
print(str(without_fraction))
print(str(without_fraction)[:-3])

try:
    without_fraction.isoformat(timespec="millisecond")
except ValueError as error:
    print(f"{type(error).__name__}: {error}")

Ausgabe:

2026-09-16T12:34:56.999
2026-09-16 12:34:56
2026-09-16 12:34
ValueError: Unknown timespec value

Die dritte Zeile ist keine gültige Millisekundenumwandlung: Sie entfernt :56, weil die Eingabe kein Nachkommafeld enthält. Bevorzugen Sie isoformat(timespec="milliseconds") oder verwenden Sie ein Format mit %f, statt das Ergebnis variabler Länge von str() zu slicen.

Wählen Sie die passende Methode

Verwenden Sie isoformat(timespec="milliseconds") für maschinenlesbare Zeitstempel und standardisierten Austausch. Diese Methode behandelt null Mikrosekunden, Abschneiden und Zeitzonenoffsets ohne manuelle String-Manipulation. Verwenden Sie strftime() plus [:-3], wenn ein Verbraucher ein eigenes Layout verlangt.

Wählen Sie nach dem Ausgabevertrag, nicht nach Bequemlichkeit: isoformat() liefert eine standardisierte Datumszeitform, strftime() liefert eine vom Aufrufer definierte Form, und str() liefert einen menschenfreundlichen Standard mit variabler Nachkommengenauigkeit. Dokumentieren Sie in jedem Fall, ob ein fehlender Offset lokale Zeit, UTC nach Konvention oder eine unbekannte Zeitzone bedeutet.

Diese Methoden formatieren ein vorhandenes datetime; sie wandeln es nicht in Millisekunden seit der Unix-Epoche um und parsen keinen String in ein datetime. Denken Sie auch daran, dass drei angezeigte Ziffern Millisekundenpräzision beschreiben, nicht zwingend die Genauigkeit der Uhr oder des gespeicherten Quellwerts.