Die Zahl Hinter dem Problem
2147483647 ist 2^31 - 1, der Maximalwert einer vorzeichenbehafteten 32-Bit Ganzzahl. In Binär:
01111111 11111111 11111111 11111111
Die führende 0 ist das Vorzeichenbit. Als Unix Timestamps in den späten 1960er Jahren entworfen wurden, war die Speicherung von Zeit als 32-Bit Ganzzahl eine pragmatische Wahl, die Genauigkeit, Speicherkosten und verfügbaren Bereich ausbalancierte. Eine vorzeichenbehaftete 32-Bit Ganzzahl bietet etwa 68 Jahre positive Timestamps ab dem 1. Januar 1970. Das war 1969 ausreichend Spielraum für die absehbare Zukunft.
Diese Zukunft ist jetzt der 19. Januar 2038 um 03:14:07 UTC.
Was Beim Überlauf Passiert
Eine Sekunde nach 2147483647 überläuft ein vorzeichenbehafteter 32-Bit Zähler:
01111111 11111111 11111111 11111111 (2147483647)
+1
10000000 00000000 00000000 00000000 (-2147483648 im Zweierkomplement)
Das Bitmuster 0x80000000, interpretiert als vorzeichenbehaftete Ganzzahl, ist -2147483648. Als Unix Timestamp entspricht dies dem 13. Dezember 1901 um 20:45:52 UTC. Jedes System, das Timestamps mit einer vorzeichenbehafteten 32-Bit Ganzzahl speichert, vergleicht oder anzeigt, erfährt eines von:
- Einen Fehler, wenn der Wert in einem Kontext verwendet wird, der negative Timestamps ablehnt
- Stille Korruption, wenn der negative Wert gespeichert und später abgerufen wird
- Falsche Datumsanzeige oder -logik (z.B. Ablaufprüfungen, die bestehen, obwohl sie fehlschlagen sollten, oder umgekehrt)
Vergleich mit Y2K
Y2K (Jahr-2000-Problem) wurde durch zweistellige Jahresdarstellungen (99 -> 00) verursacht. Es war weit verbreitet, weil fast alle Software, die vor den späten 1990er Jahren geschrieben wurde, dieses Format verwendete, und die Fehlerart war stille Datenkorruption (das Jahr 2000 könnte als 1900 interpretiert werden).
Y2K38 ist strukturell ähnlich, aber begrenzter:
- Y2K betraf Software unabhängig von der Architektur. Y2K38 betrifft nur Systeme, die 32-Bit time_t verwenden.
- Y2K erforderte Änderungen an Anwendungssoftware, Datenbanken und Datenaustauschformaten. Y2K38 erfordert eine Neukompilierung mit 64-Bit time_t, was für den Großteil der aktiven Software eine einmalige Änderung ist.
- Y2K38 hat eine bekannte, testbare Schwelle. Systeme können vor 2038 mit Test-Timestamps validiert werden.
Konvertiere den Y2K38 Timestamp mit dem Unix Timestamp Konverter oder decodiere JWT Tokens mit JWT Decoder.