Guide
Zeitstempel in Logs und JSON richtig lesen
Eine Logdatei voller zehnstelliger Zahlen ist eine Logdatei voller Daten, die Sie noch nicht lesen können.
By Buğra SözeriPublished
Öffnen Sie fast jedes Server-Log oder eine rohe JSON-API- Antwort, stoßen Sie irgendwann auf ein Feld, das nur eine Zahl ist: 1732650000, oder vielleicht 1732650000000. Nichts an den Ziffern selbst sagt, welches Datum das ist, oder auch nur, welche Einheit Sie vor sich haben. Das ist eine der häufigsten kleinen Reibungen beim Debuggen — Sie starren genau auf die Daten, die Sie brauchen, und sie sind unlesbar, bis Sie sie umrechnen. Dieser Ratgeber ist eine praktische Anleitung, wie man diese Zahlen schnell liest, ohne zu raten.
Der Ziffernzahl-Trick
Jeder Unix-Zeitstempel, dem Sie in einem modernen Log oder einer API-Antwort begegnen, fällt in eine von vier Auflösungen, und für jedes Datum zwischen etwa 2001 und 2286 haben diese eine unterschiedliche Ziffernzahl:
| Ziffern | Einheit | Beispiel | Entspricht |
|---|---|---|---|
| 10 | Sekunden | 1732650000 | 2024-11-26T21:00:00Z |
| 13 | Millisekunden | 1732650000000 | 2024-11-26T21:00:00.000Z |
| 16 | Mikrosekunden | 1732650000000000 | 2024-11-26T21:00:00.000000Z |
| 19 | Nanosekunden | 1732650000000000000 | 2024-11-26T21:00:00.000000000Z |
Jeder Schritt fügt genau drei Stellen hinzu, weil jede Einheit 1000-mal feiner ist als die vorherige, und dieses Verhältnis gilt zu jedem Zeitpunkt der aktuellen Ära — Sie müssen das tatsächliche Datum nicht kennen, um Ziffern zu zählen, zählen Sie sie einfach zuerst und rechnen Sie dann um. Das ist dieselbe Erkennungsmethode, die unser Zeitstempel-Umrechner automatisch verwendet, aber es lohnt sich, sie auf einen Blick zu kennen, für die Momente, in denen Sie nur ein Log im Terminal überfliegen.
Logdateien: Achten Sie auf gemischte Einheiten in derselben Datei
Eine einzelne Logdatei kann tatsächlich Auflösungen mischen, weil sie Ausgaben aus mehr als einer Quelle zusammenführt. Ein Reverse-Proxy protokolliert Anfragezeiten vielleicht in Sekunden, während der dahinterliegende Anwendungsserver in Millisekunden protokolliert; ein Node.js-Prozess (Date.now() ist üblicherweise Millisekunden), der in denselben zusammengeführten Stream schreibt wie ein Go-Dienst (time.Now().Unix() ist üblicherweise Sekunden), erzeugt genau diese Mischung. Es gibt keine Möglichkeit, das nachträglich zu beheben, außer Zeile für Zeile anhand der eigenen Ziffernzahl jedes Werts umzurechnen — dateiweite Konsistenz anzunehmen ist eine zuverlässige Methode, die Hälfte Ihres Logs falsch zu lesen.
Wenn Sie eine Spalte von Zeitstempeln aus einem Log zur Analyse extrahieren — etwa alles, was auf ein grep-Muster passt, oder eine aus einem Log-Viewer exportierte Spalte —, fügen Sie die gesamte Liste in einen Umrechner ein, der Stapeleingabe akzeptiert, statt Werte einzeln umzurechnen. Jede Zeile wird unabhängig erkannt und umgerechnet, sodass gemischte Einheiten im selben eingefügten Text kein Problem sind.
JSON-API-Antworten: String oder Ganzzahl, und wie man es erkennt
Ein JSON-Payload liefert eine weitere Variable: ob das Zeitstempelfeld eine rohe Zahl oder ein formatierter String ist. Beides ist üblich, und keines ist von Natur aus besser — es sind einfach unterschiedliche Designentscheidungen, ausführlicher behandelt in unserem Ratgeber epoch vs. ISO 8601 vs. RFC 3339 guide. In der Praxis:
"created_at": 1732650000 ist eine rohe Epoch-Ganzzahl — wenden Sie die obige Ziffernzahl-Prüfung an. "created_at": "2024-11-26T21:00:00Z" ist bereits ein RFC-3339-String und so lesbar, keine Umrechnung nötig. Manche APIs senden verwirrenderweise die Zahl als String ("created_at": "1732650000") — das ist nach der Ziffernzahl-Regel weiterhin ein Epoch-Wert, nur in Anführungszeichen, meist weil die API-Autorin oder der API-Autor nicht wollte, dass eine 64-Bit-Ganzzahl von einer Client-Sprache mit nur 53-Bit-sicheren Zahlen (meist JavaScripts Number-Typ) stillschweigend abgeschnitten wird. Wenn Ihr Workflow das Umformen der Antwort einschließt — etwa das Feld in eine Tabelle oder ein anderes strukturiertes Format zu übernehmen —, übernimmt der CSV-↔-JSON-Umrechner die strukturelle Umwandlung; die Zeitstempelwerte selbst würden Sie danach weiterhin durch einen dedizierten Umrechner laufen lassen.
Eine kurze mentale Checkliste
Wenn Sie in einem Log oder Antwortkörper auf einen unlesbaren Zeitstempel stoßen: Zählen Sie zuerst die Ziffern (zehn, dreizehn, sechzehn oder neunzehn verrät die Einheit); prüfen Sie, ob er als String in Anführungszeichen steht oder als nackte Zahl, da das nur beeinflusst, wie Sie ihn extrahieren, nicht, was er bedeutet; und mischt dieselbe Datei Einheiten, rechnen Sie pro Zeile um, statt für die ganze Datei eine Auflösung anzunehmen. Nichts davon erfordert das Auswendiglernen von Umrechnungsfaktoren — es ist Mustererkennung, die Sie sich nach ein paar Dutzend Malen aneignen, und ein Umrechner übernimmt so oder so die Rechnung.
Frequently asked questions
- Wie erkenne ich, ob ein Log-Zeitstempel Sekunden oder Millisekunden sind?
- Zählen Sie die Ziffern des ganzzahligen Teils. Rund zehn Stellen (deckt Daten von 2001 bis 2286 ab) bedeuten Sekunden; dreizehn Stellen bedeuten Millisekunden; sechzehn Mikrosekunden; neunzehn Nanosekunden. Das funktioniert, weil jede Einheit 1000-mal feiner ist als die vorherige, was in der aktuellen Ära bei jedem Datum genau drei Stellen hinzufügt.
- Warum verwenden verschiedene Logzeilen in derselben Datei manchmal unterschiedliche Einheiten?
- Meist weil das Log die Ausgabe mehrerer Dienste oder Bibliotheken zusammenführt, die nie auf eine einheitliche Epoch-Auflösung standardisiert wurden — ein Java-Dienst, der Millisekunden loggt, neben einem Shell-Skript, das Sekunden loggt, ist der klassische Fall. Es gibt keine zuverlässige Möglichkeit, das nachträglich zu vereinheitlichen; Sie rechnen jede Zeile nach ihrer eigenen Ziffernzahl um.
- Kann ich eine ganze Logdatei in einen Zeitstempel-Umrechner einfügen?
- Sie können eine Liste roher Epoch-Werte, einen pro Zeile, einfügen und jeden unabhängig umgerechnet bekommen — das ist der schnellste Weg, eine Spalte von Zeitstempeln aus einem Log- oder Datenbankexport zu überfliegen. Sie müssten zunächst nur die numerische Zeitstempel-Spalte aus dem rohen Log-Text extrahieren, etwa mit einem schnellen grep oder einer Tabellenkalkulations-Aufteilung.
- Warum sendet eine JSON-API einen Zeitstempel manchmal als String und manchmal als Zahl?
- Weil es keinen einzigen Standard gibt — manche APIs geben eine rohe Epoch-Ganzzahl aus (kompakt, aber Sie müssen die Einheit kennen), andere einen RFC-3339-String (selbstbeschreibend, leicht in einem Antwortkörper zu überfliegen). Beide stellen denselben Zeitpunkt dar; welchen Sie bekommen, ist rein die Wahl der API-Entwicklerin oder des API-Entwicklers, dokumentiert (hoffentlich) im Schema des Felds.
Sources & references
Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.
- IEEE Std 1003.1-2024 (POSIX) — seconds since the Epoch — Die Definition von time_t, auf der die meisten Log-Zeitstempel und JSON-Epoch-Felder aufbauen(as of )
- IETF RFC 3339 — Date and Time on the Internet — Das Stringformat, das viele neuere JSON-APIs statt einer rohen Epoch-Ganzzahl verwenden(as of )
- Elastic — @timestamp field and date formats in Elasticsearch — Beispiel eines weitverbreiteten Logging-Stacks, der für dasselbe Feld sowohl Epoch-Millisekunden als auch formatierte Datumsstrings akzeptiert(as of )
Related
Published September 25, 2026