Nanosekunden zu Datum
Wandeln Sie Nanosekunden in ein lesbares Datum um. Geben Sie den Zeitstempel in Nanosekunden ein (z. B. 1704067200000000000).
Ein Nanosekunden-Zeitstempel verliert in einer JavaScript-Zahl stillschweigend seine letzten drei Stellen
JavaScript-Zahlen halten ganze Zahlen nur bis 2⁵³ − 1 exakt. Ein aktueller Nanosekunden-Zeitstempel liegt bei etwa 1,77 × 10¹⁸ und überschreitet diese Grenze um den Faktor 196. Geben Sie einen ein, und aus 1770000000123456789 wird 1770000000123456800 — kein Fehler, keine Warnung, einfach drei Stellen leise ersetzt.
So wird gerechnet
- Wandelt Nanosekunden-Zeitstempel in Daten und zurück und erhält dabei den Anteil unterhalb einer Millisekunde.
- Weist auf die Präzisionsgrenze hin, denn dieses Versagen ist leise und nicht laut.
- Übernimmt die Umrechnung in Millisekunden, die die meisten Datumsbibliotheken als Eingabe verlangen.
Nanosekunden ÷ 1.000.000 = Millisekunden Nanosekunden ÷ 1.000.000.000 = Sekunden MAX_SAFE_INTEGER = 9.007.199.254.740.991 (2⁵³ − 1) in Nanosekunden umfasst dieser gesamte Bereich nur rund 104 Tage in Millisekunden umfasst er rund 285.000 Jahre
Rechenbeispiel
Was jede Zeiteinheit innerhalb des sicheren Ganzzahlbereichs abdeckt und was beim Überschreiten passiert.
- Millisekunden: 2⁵³ deckt rund 285.000 Jahre ab
- Mikrosekunden: rund 285 Jahre
- Nanosekunden: rund 0,285 Jahre — etwa 104 Tage
- 1770000000123456789 einer Zahl zugewiesen
- wird zurückgelesen als 1770000000123456800
Die letzten drei Stellen haben sich geändert, und nichts hat es gemeldet. Ein Nanosekunden-Zeitstempel braucht BigInt oder eine Zeichenkette; ihn in einer gewöhnlichen Zahl zu halten ist keine Rundungsunbequemlichkeit, sondern die Garantie, dass jedes Detail unterhalb einer Mikrosekunde Fiktion ist.
Das Ergebnis lesen
- Rechnen Sie mit BigInt und wandeln Sie erst in eine Zahl um, nachdem Sie auf Millisekunden heruntergeteilt haben. Die Division muss im BigInt-Raum stattfinden — erst umwandeln und dann teilen hat die Stellen, die Sie erhalten wollten, bereits zerstört.
- Datenbanken und Übertragungsformate führen Nanosekunden genau deshalb häufig als Zeichenketten. Eine solche Zeichenkette zum Aufräumen in eine Gleitkommazahl zu parsen ist die häufigste Art, die Präzision zu verlieren, und es geschieht in der Schicht, die niemand prüft.
- Das JavaScript-Date selbst ist millisekundenbasiert und kann Zeiten unterhalb einer Millisekunde gar nicht darstellen. Nanosekunden in ein Date zu wandeln verwirft den Rest konstruktionsbedingt, der Verlust dort ist also erwartbar und kein Fehler — überraschend ist nur, wenn er still während einer Rechnung eintritt.
- Nanosekundengenauigkeit ist selten die tatsächliche Anforderung. Log-Sortierung, Tracing und Profiling brauchen meist monotone Reihenfolge statt absoluter Nanosekundengenauigkeit, und eine monotone Uhr liefert das ohne das Darstellungsproblem.
Häufige Fragen
- Warum hat sich mein Zeitstempel um ein paar hundert Nanosekunden geändert?
- Er wurde in einer Gleitkommazahl abgelegt, die ihn nicht darstellen kann. Oberhalb von 2⁵³ − 1 werden ganze Zahlen auf den nächsten darstellbaren Wert gerundet, aus 1770000000123456789 wird also 1770000000123456800. Nichts wirft einen Fehler, denn das ist definiertes Verhalten und kein Defekt.
- Wie sollten Nanosekunden-Zeitstempel gespeichert werden?
- Als BigInt in JavaScript, als 64-Bit-Ganzzahl in den meisten anderen Sprachen oder als Zeichenkette beim Überschreiten einer Grenze wie JSON. Wandeln Sie erst in eine Zahl um, wenn Sie auf Millisekunden heruntergeteilt haben und die zusätzlichen Stellen nicht mehr brauchen.