Unix-Zeitstempel erklÀrt: Umrechnung und hÀufige Fallstricke
Ein Unix-Zeitstempel ist eines der einfachsten und zugleich am meisten missverstandenen Konzepte in der Programmierung. Es ist die Anzahl der Sekunden, die seit dem 1. Januar 1970, 00:00:00 UTC vergangen sind â ein Moment, der als Unix-Epoch bekannt ist. Trotz seiner Einfachheit sind Zeitstempel eine Quelle von Fehlern im Zusammenhang mit Zeitzonen, PrĂ€zision und Ăberlauf.
Was ist die Unix-Epoch?
Die Unix-Epoch â 1. Januar 1970, 00:00:00 UTC â wurde als Startpunkt fĂŒr Unix-Zeit gewĂ€hlt. Jeder Zeitstempel wird relativ zu diesem Moment gemessen:
| Zeitstempel | Datum und Uhrzeit (UTC) |
|---|---|
| 0 | 1. Jan. 1970 00:00:00 |
| 86400 | 2. Jan. 1970 00:00:00 |
| 1000000000 | 9. Sep. 2001 01:46:40 |
| 1700000000 | 14. Nov. 2023 22:13:20 |
| 2000000000 | 18. Mai 2033 03:33:20 |
Negative Zeitstempel stellen Daten vor der Epoch dar. Zum Beispiel ist -86400 der 31. Dezember 1969.
Rechnen Sie Zeitstempel sofort mit unserem Zeitstempel-Konverter um.
Sekunden vs. Millisekunden
Dies ist die hÀufigste Quelle von Verwirrung. Verschiedene Systeme verwenden unterschiedliche PrÀzisionen:
| System | PrÀzision | Beispiel |
|---|---|---|
| Unix/POSIX | Sekunden | 1700000000 |
| JavaScript | Millisekunden | 1700000000000 |
| Java (System.currentTimeMillis) | Millisekunden | 1700000000000 |
| Python (time.time) | Sekunden (Float) | 1700000000.123 |
| PostgreSQL (extract epoch) | Sekunden (Float) | 1700000000.123456 |
Faustregel: Wenn die Zahl 13 Stellen hat, sind es Millisekunden. Bei 10 Stellen sind es Sekunden.
// JavaScript gibt Millisekunden zurĂŒck
const nowMs = Date.now(); // 1700000000000
const nowSec = Math.floor(nowMs / 1000); // 1700000000
Zeitzonen-Behandlung
Unix-Zeitstempel sind immer UTC. Sie enthalten keine Zeitzoneninformation. Das ist tatsĂ€chlich ein Vorteil â es bietet einen universellen Referenzpunkt.
Die Verwirrung entsteht bei der Umrechnung von Zeitstempeln in lesbare Daten:
const ts = 1700000000;
const date = new Date(ts * 1000);
date.toUTCString(); // "Tue, 14 Nov 2023 22:13:20 GMT"
date.toLocaleString(); // AbhÀngig von der lokalen Zeitzone des Benutzers
date.toISOString(); // "2023-11-14T22:13:20.000Z"
Best Practice: Zeitstempel in UTC speichern und ĂŒbertragen. Nur auf der Darstellungsebene in lokale Zeit umrechnen, so nah am Benutzer wie möglich.
Das Jahr-2038-Problem
Traditionelle Unix-Systeme speichern Zeitstempel als vorzeichenbehaftete 32-Bit-Ganzzahl. Der Maximalwert ist 2.147.483.647, was dem 19. Januar 2038, 03:14:07 UTC entspricht.
Nach diesem Moment laufen 32-Bit-Zeitstempel in negative Werte ĂŒber und springen zurĂŒck zum 13. Dezember 1901. Dies ist analog zum Y2K-Bug.
Aktueller Stand:
- Die meisten modernen Systeme verwenden 64-Bit-Zeitstempel (ausreichend bis zum Jahr 292 Milliarden)
- Der Linux-Kernel ist seit Version 5.6 (2020) 64-Bit-Zeitstempel-kompatibel
- Eingebettete Systeme und Legacy-Datenbanken sind weiterhin gefÀhrdet
- Wenn Sie Software bauen, die Daten nach 2038 verarbeitet, ĂŒberprĂŒfen Sie Ihre Zeitstempel-Speicherung
Umrechnung in verschiedenen Sprachen
JavaScript
// Aktueller Zeitstempel (Sekunden)
const now = Math.floor(Date.now() / 1000);
// Zeitstempel zu Date
const date = new Date(1700000000 * 1000);
// Date zu Zeitstempel
const ts = Math.floor(new Date('2023-11-14').getTime() / 1000);
Python
import time, datetime
# Aktueller Zeitstempel
now = int(time.time())
# Zeitstempel zu datetime
dt = datetime.datetime.fromtimestamp(1700000000, tz=datetime.timezone.utc)
# Datetime zu Zeitstempel
ts = int(dt.timestamp())
SQL (PostgreSQL)
-- Aktueller Zeitstempel
SELECT EXTRACT(EPOCH FROM NOW());
-- Zeitstempel zu Datum
SELECT TO_TIMESTAMP(1700000000);
-- Datum zu Zeitstempel
SELECT EXTRACT(EPOCH FROM '2023-11-14'::timestamp);
HĂ€ufige Fallstricke
1. Sekunden und Millisekunden verwechseln
Wenn ein Datum als Januar 1970 angezeigt wird, haben Sie wahrscheinlich Sekunden ĂŒbergeben, wo Millisekunden erwartet wurden (oder umgekehrt). PrĂŒfen Sie immer, welche PrĂ€zision die API erwartet.
2. Zeitzonen in Datumszeichenketten ignorieren
Das Parsen von "2023-11-14" ohne Zeitzone erzeugt das Datum in der lokalen Zeitzone, die je nach Serverstandort variiert. SchlieĂen Sie immer die Zeitzone ein: "2023-11-14T00:00:00Z".
3. Gleitkomma-PrÀzision
Beim Speichern von Zeitstempeln als Gleitkommazahlen können Sie PrĂ€zision jenseits von Millisekunden verlieren. FĂŒr Mikrosekunden- oder Nanosekunden-PrĂ€zision verwenden Sie Ganzzahlen mit dem entsprechenden Multiplikator.
4. Schaltsekunden
Unix-Zeitstempel berĂŒcksichtigen keine Schaltsekunden. Ein Unix-Tag ist immer genau 86.400 Sekunden, auch wenn tatsĂ€chliche UTC-Tage gelegentlich 86.401 Sekunden haben. FĂŒr die meisten Anwendungen ist dies irrelevant. FĂŒr wissenschaftliche oder Satellitenanwendungen verwenden Sie stattdessen TAI (Internationale Atomzeit).
ISO 8601: Die menschenlesbare Alternative
WĂ€hrend Zeitstempel groĂartig fĂŒr Berechnungen sind, ist ISO 8601 der Standard fĂŒr menschenlesbare Datumsdarstellung:
2023-11-14T22:13:20Z # UTC
2023-11-14T17:13:20-05:00 # Eastern Time
2023-11-14 # Nur Datum
Die meisten APIs sollten ISO-8601-Zeichenketten akzeptieren und zurĂŒckgeben. Verwenden Sie Zeitstempel intern fĂŒr Berechnungen und Speicherung.
FAQ
Warum beginnt die Unix-Zeit am 1. Januar 1970?
Das Datum wurde willkĂŒrlich gewĂ€hlt, als Unix in den frĂŒhen 1970er Jahren bei Bell Labs entwickelt wurde. Ein ausreichend aktuelles Datum war nötig, um keine Bits fĂŒr weit zurĂŒckliegende Daten zu verschwenden. Da 32-Bit-Ganzzahlen etwa 68 Jahre in jede Richtung speichern können, deckte der Start bei 1970 Daten von 1901 bis 2038 ab.
Sollte ich Daten als Zeitstempel oder formatierte Zeichenketten in meiner Datenbank speichern?
Speichern Sie Daten als Zeitstempel (Ganzzahl oder native Datetime-Typen) fĂŒr effizientes Sortieren, Vergleichen und Rechnen. Formatierte Zeichenketten sind schwerer abzufragen und korrekt zu sortieren. Die meisten Datenbanken haben native Datetime-Typen, die dies gut handhaben. Reservieren Sie die Zeichenkettenformatierung fĂŒr die Anzeige und API-Antworten.
Verwandte Ressourcen
- Zeitstempel-Konverter â Zwischen Unix-Zeitstempeln und lesbaren Daten umrechnen
- JSON-Formatierung Best Practices â Umgang mit Daten in JSON-Antworten
- UUID-Leitfaden â Ein weiteres gĂ€ngiges Identifikatorformat mit zeitbasierten Varianten