Was ist ein Unix-Zeitstempel?
Der Unix-Zeitstempel (Unix time, Epoch) zählt die Sekunden seit dem 1. Januar 1970, 00:00:00 Uhr UTC. Er kennt keine Zeitzonen und keine Sommerzeit, darum eignet er sich gut zum Speichern und Vergleichen von Zeitpunkten. Erst bei der Anzeige wird er in eine lokale Zeit umgerechnet. JavaScript, Java und viele APIs arbeiten mit Millisekunden, also einer 13-stelligen Zahl statt der üblichen 10 Stellen. Der Rechner oben erkennt das automatisch.
Die wichtigsten Shell-Befehle
| Befehl | Ergebnis |
|---|---|
date +%s | aktueller Zeitstempel in Sekunden |
date +%s%3N | aktueller Zeitstempel in Millisekunden (GNU date) |
date -d @1798761600 | Zeitstempel als lokales Datum |
date -u -d @1798761600 +%FT%TZ | Zeitstempel als ISO 8601 in UTC |
date -d "2027-01-01 01:00" +%s | Datum (lokale Zeit) in Zeitstempel |
date -d "3 days ago" +%s | Zeitstempel von vor drei Tagen, praktisch für Skripte |
date -r 1798761600 | macOS und BSD: Zeitstempel als Datum (dort ohne -d @) |
In einer crontab muss das Prozentzeichen maskiert werden: date +\%s. Mehr dazu im Cron-Generator.
Zeitstempel in Logs
Manche Logs schreiben rohe Zeitstempel, etwa Squid, HAProxy-Statistiken, Fail2ban-Datenbanken oder eigene Skripte. Mit GNU awk machst du sie in einem Rutsch lesbar:
awk '{ $1 = strftime("%F %T", $1); print }' access.logBei journalctl kannst du direkt mit Zeitstempeln filtern: journalctl --since "@1798761600". Für Kernel-Meldungen mit lesbarer Zeit gibt es dmesg -T, die Angabe ist dort aber nach einem Ruhezustand ungenau.
MySQL und MariaDB: FROM_UNIXTIME und UNIX_TIMESTAMP
SELECT FROM_UNIXTIME(1798761600); -- Zeitstempel in Datum
SELECT UNIX_TIMESTAMP('2027-01-01 01:00:00'); -- Datum in Zeitstempel
SELECT * FROM wp_options WHERE option_name LIKE '_transient_timeout_%'
AND option_value < UNIX_TIMESTAMP(); -- abgelaufene TransientsBeide Funktionen rechnen in der Zeitzone der Datenbanksitzung (SELECT @@session.time_zone;), nicht zwingend in der des Servers oder der Anwendung. WordPress speichert zum Beispiel Ablaufzeiten von Transients als Zeitstempel, Beiträge aber als Datum in lokaler und in UTC-Zeit (post_date und post_date_gmt).
Das Jahr-2038-Problem
Wird der Zeitstempel als vorzeichenbehaftete 32-Bit-Zahl gespeichert, ist am 19. Januar 2038 um 03:14:07 Uhr UTC Schluss (Wert 2147483647). Eine Sekunde später springt die Zahl ins Negative, also ins Jahr 1901. Aktuelle 64-Bit-Systeme sind nicht betroffen, wohl aber:
- Spalten vom Typ
TIMESTAMPin MySQL, deren Wertebereich am 19.01.2038 endet. MariaDB hat den Bereich ab Version 11.5 auf 64-Bit-Systemen bis ins Jahr 2106 erweitert. Für weit in der Zukunft liegende Daten istDATETIMEder sichere Typ. - Spalten vom Typ
INTstattBIGINTfür Zeitstempel. - alte 32-Bit-Systeme, Embedded-Geräte und ältere PHP-Versionen auf 32-Bit.
Ablaufdaten von Lizenzen, Zertifikaten oder Abos mit langer Laufzeit können die Grenze schon heute überschreiten. Teste solche Felder mit einem Datum nach 2038.