In Protokolldateien, Datenbanken und API-Antworten erscheint anstelle des Datums häufig eine lange Zahl, beispielsweise 1767225600. Dabei handelt es sich um den Unix-Zeitstempel (auf Englisch „Unix timestamp“ oder „epoch time“). In dieser Anleitung erläutern wir, was dies bedeutet, wie Sie diesen Wert auf einem Linux-Server – beispielsweise einem KVM-VPS – in ein lesbares Datum umwandeln und wieder zurückrechnen können sowie worauf Sie hinsichtlich Zeitzonen und Millisekunden achten sollten.
Für die schnelle Umrechnung einzelner Werte können Sie auch unseren im Browser laufenden Umrechner nutzen; auf dem Server können Sie dies mit den unten aufgeführten Befehlen durchführen.
Unix-Timestamp-Umrechner
Timestamp in Datum umrechnen
- Ortszeit
- UTC
- ISO 8601 (UTC)
- ISO 8601 (Ortszeit)
- Relativ zu jetzt
- Auf der Kommandozeile
Datum in Timestamp umrechnen
- Unix-Timestamp
- In Millisekunden
- Ortszeit
- UTC
- Auf der Kommandozeile
Die Umrechnung läuft in Ihrem Browser und sendet keine Daten.
Wir haben die Befehle im November 2026 auf den Systemen AlmaLinux 10.2 (GNU coreutils 9.5, gawk 5.3) und Ubuntu 26.04 (uutils coreutils 0.10, gawk 5.3, mawk 1.3.4) getestet; die macOS-Varianten wurden unter macOS 26 getestet.
Was ist ein Unix-Zeitstempel?
Der Unix-Zeitstempel ist die Anzahl der Sekunden, die seit dem 1. Januar 1970, 00:00:00 UTC (der „Epoch“) vergangen sind. Einige wichtige Eigenschaften:
- Er hat keine Zeitzone. Dieselbe Zahl steht in Budapest, New York und Tokio für denselben Zeitpunkt; eine Zeitzone kommt erst ins Spiel, wenn die Zahl in ein Datum umgewandelt wird. Die Zahl
1767225600entspricht beispielsweise dem 1. Januar 2026 um 00:00:00 UTC, was in Budapest 01:00:00 (MEZ) entspricht. - Schaltsekunden werden nicht berücksichtigt. Gemäß dem POSIX-Standard umfasst jeder Tag genau 86.400 Sekunden, weshalb zwischen dem Zeitstempel und der astronomischen Zeit eine Abweichung von einigen Sekunden besteht, die in der Praxis jedoch keine Rolle spielt.
- Zeitpunkte vor 1970 sind negativ:
-1entspricht dem 31. Dezember 1969, 23:59:59 UTC.
Wo finden Sie diese? In der Ausgabe von journalctl -o short-unix, im Audit-Protokoll (/var/log/audit/audit.log, z. B. msg=audit(1794162987.503:641)), in den Spalten INT oder BIGINT von Datenbanken, in JSON-APIs, im Feld exp von JWT-Token sowie im Änderungszeitstempel von Dateien (stat -c %Y fajl). Informationen zum Lesen von Protokollen finden Sie in unserer Anleitung Lesen von Protokolldateien unter Linux.
Sekunde, Millisekunde oder Mikrosekunde?
Viele Systeme speichern den Zeitstempel nicht in Sekunden, sondern in feineren Einheiten. Derzeit (bis 2286) lässt sich anhand der Anzahl der Ziffern erkennen, um welche Einheit es sich handelt:
| Ziffern | Einheit | Beispiel | Wo es vorkommt |
|---|---|---|---|
| 10 | Sekunde | 1767225600 |
date +%s, PHP time(), MySQL UNIX_TIMESTAMP() |
| 13 | Millisekunde (ms) | 1767225600123 |
JavaScript Date.now(), Java, zahlreiche REST-APIs |
| 16 | Mikrosekunde (µs) | 1767225600123456 |
bestimmte Log-Formate und Datenbanken |
| 19 | Nanosekunde (ns) | 1767225600123456789 |
date +%s%N, Go |
Der häufigste Fehler besteht darin, dass das Programm einen Wert in Millisekunden als Sekunden interpretiert. Der Befehl date meldet in diesem Fall keinen Fehler, sondern gibt ein sehr weit in der Zukunft liegendes Datum aus:
date -d @1767225600123
# Thu Feb 25 01:02:03 AM CET 57971
Teilen Sie in diesem Fall den Wert durch 1000 (oder lassen Sie die letzten drei Ziffern weg) bzw. geben Sie ihn als Dezimalzahl an:
date -d @$((1767225600123 / 1000))
date -d @1767225600.123 +'%F %T.%3N'
# 2026-01-01 01:00:00.123
Abfrage der aktuellen Unix-Zeit
# In Sekunden
date +%s
# In Millisekunden bzw. Nanosekunden
date +%s%3N
date +%s%N
# In Bash 5 auch ohne externen Befehl (sekunden- bzw. mikrosekundengenau)
echo $EPOCHSECONDS
echo $EPOCHREALTIME
Umwandlung eines Zeitstempels in ein Datum mit dem Befehl „date“
Der GNU-Befehl date erhält den Zeitpunkt über den Schalter -d (--date); das Zeichen @ kennzeichnet, dass es sich um einen Unix-Zeitstempel handelt:
# In der Zeitzone des Servers
date -d @1767225600
# Thu Jan 1 01:00:00 AM CET 2026
# UTC-ben
date -u -d @1767225600
# Thu Jan 1 12:00:00 AM UTC 2026
# In einer anderen Zeitzone (ändert die Servereinstellung nicht)
TZ=America/New_York date -d @1767225600
# Wed Dec 31 07:00:00 PM EST 2025
# Im Format ISO 8601, mit Zeitzonenversatz
date -d @1767225600 --iso-8601=seconds
# 2026-01-01T01:00:00+01:00
# Im Format RFC 5322 (E-Mail-Header)
date -d @1767225600 -R
# Thu, 01 Jan 2026 01:00:00 +0100
# In einem eigenen Format
date -d @1767225600 +'%Y-%m-%d %H:%M:%S'
# 2026-01-01 01:00:00
Die Sprache und das Format der Ausgabe werden durch die Spracheinstellung (Locale) bestimmt. Auf dem AlmaLinux-10-Cloud-Image ist en_US.UTF-8 die Standardeinstellung, daher erhalten Sie eine Ausgabe im englischen 12-Stunden-Format. Um das ungarische Format zu verwenden, installieren Sie bitte das ungarische Sprachpaket (sudo dnf install glibc-langpack-hu) und legen Sie die Variable LC_TIME fest:
LC_TIME=hu_HU.UTF-8 date -d @1767225600
# 2026. jan. 1., csütörtök, 01:00:00 CET
In Skripten empfiehlt es sich, ein eigenes Format (+'%Y-%m-%d %H:%M:%S' oder +%F %T) zu verwenden, da dieses unabhängig von den Spracheinstellungen ist.
Auch der in Bash integrierte Befehl printf kann Zeitstempel formatieren, ohne dass ein externes Programm gestartet werden muss, was in Schleifen schneller ist:
printf '%(%F %T)T\n' 1767225600
# 2026-01-01 01:00:00
Umwandlung des Datums in einen Zeitstempel
Das Format +%s gibt den Unix-Zeitstempel des angegebenen Datums aus. Ohne Angabe einer Zeitzone interpretiert date das Datum in der Zeitzone des Servers, weshalb dasselbe Datum auf einem anderen Server einen anderen Zeitstempel ergeben kann:
# In der Zeitzone des Servers (hier Europe/Budapest)
date -d '2026-11-08 14:30' +%s
# 1794144600
# Als UTC interpretiert
date -u -d '2026-11-08 14:30' +%s
date -d '2026-11-08 14:30 UTC' +%s
# 1794148200
# Mit Zeitzonenversatz (ISO 8601)
date -d '2026-11-08T14:30:00+01:00' +%s
# 1794144600
# In einer bestimmten Zeitzone
TZ=Europe/Budapest date -d '2026-11-08 14:30' +%s
date -d 'TZ="America/New_York" 2026-11-08 14:30' +%s
# 1794166200
# Nur Datum: 00:00 Uhr des Tages in der Zeitzone des Servers
date -d '2026-11-08' +%s
# 1794092400
Der Befehl date versteht auch relative Zeitangaben, was bei geplanten Aufgaben und der Berechnung von Ablaufdaten nützlich ist:
date -d 'now + 7 days' +%s
date -d 'tomorrow 00:00' +%s
date -d '+7 days'
Der Zeitpunkt der letzten Änderung einer Datei wird vom Befehl stat als Zeitstempel und vom GNU-Befehl date mit dem Schalter -r als Datum angegeben:
stat -c %Y /etc/hostname
date -r /etc/hostname +%s
date -r /etc/hostname
Umwandlung von Zeitstempeln in Protokolldateien
Wenn die erste Spalte einer Datei einen Unix-Zeitstempel enthält, können Sie diesen mit der awk-Funktion strftime() zeilenweise umwandeln. Beispieldatei (esemenyek.log):
1767225600 login alice
1767229200 logout alice
1794144600 login bob
# Erste Spalte durch ein lesbares Datum ersetzen (in der Zeitzone des Servers)
awk '{ $1 = strftime("%Y-%m-%d %H:%M:%S", $1); print }' esemenyek.log
# 2026-01-01 01:00:00 login alice
# 2026-01-01 02:00:00 logout alice
# 2026-11-08 14:30:00 login bob
# In UTC: der dritte Parameter ist 1
awk '{ print strftime("%F %T", $1, 1), $2, $3 }' esemenyek.log
# Bei einem Zeitstempel in Millisekunden durch 1000 teilen
awk '{ $1 = strftime("%F %T", $1 / 1000); print }' esemenyek-ms.log
Die Funktion strftime() ist zwar nicht Teil des POSIX-awk-Standards, wird jedoch sowohl von GNU awk (gawk) als auch von der Version 1.3.4 von Debian/Ubuntu mawk unterstützt: Im Test lieferten beide das gleiche Ergebnis. Im Test war der awk-Befehl sowohl unter AlmaLinux als auch unter Ubuntu 26.04 gawk. Sollte dies auf einem älteren System dennoch nicht funktionieren, verwenden Sie bitte eine while read-Schleife:
while read -r ts rest; do
echo "$(date -d @"$ts" '+%F %T') $rest"
done < esemenyek.log
Bei großen Dateien ist dies langsamer, da pro Zeile ein date-Prozess gestartet wird; in diesem Fall ist printf '%(%F %T)T' schneller.
Einige Tools konvertieren die Zeitstempel selbst: journalctl zeigt standardmäßig das Datum an (die Option -o short-unix hingegen genau umgekehrt den Zeitstempel), und im Audit-Protokoll gibt ausearch -i die Werte msg=audit(...) als Datum aus. Über die Analyse von Webserver-Protokollen haben wir in unserem Beitrag Analyse von Webserver-Protokollen berichtet.
Schnelle Entsprechungen in anderen Programmiersprachen
PHP
php -r 'echo date("c", 1767225600), PHP_EOL;'
php -r 'echo time(), PHP_EOL;'
php -r 'echo strtotime("2026-11-08 14:30"), PHP_EOL;'
PHP verwendet nicht die Systemzeitzone, sondern die in der Einstellung date.timezone festgelegte Zeitzone; die Umgebungsvariable TZ wird dabei ignoriert. Unter AlmaLinux 10 war die Standardeinstellung für PHP 8.3 in der Befehlszeile „UTC“, weshalb der erste Befehl den Wert 2026-01-01T00:00:00+00:00 und strtotime, als UTC interpretiert, den Wert 1794148200 ergab. Die Zeitzone können Sie in der Datei php.ini oder auf Befehlsebene festlegen:
php -d date.timezone=Europe/Budapest -r 'echo date("c", 1767225600), PHP_EOL;'
# 2026-01-01T01:00:00+01:00
Python
python3 -c 'import time; print(int(time.time()))'
python3 -c 'import datetime as d; print(d.datetime.fromtimestamp(1767225600))'
python3 -c 'import datetime as d; print(d.datetime.fromtimestamp(1767225600, d.timezone.utc).isoformat())'
python3 -c 'import datetime as d; print(int(d.datetime(2026, 11, 8, 14, 30).timestamp()))'
Die Funktion fromtimestamp() verwendet ohne Angabe einer Zeitzone die Systemzeitzone (2026-01-01 01:00:00), mit dem Parameter d.timezone.utc hingegen UTC (2026-01-01T00:00:00+00:00).
MySQL und MariaDB
SELECT FROM_UNIXTIME(1767225600);
SELECT FROM_UNIXTIME(1767225600, '%Y.%m.%d %H:%i');
SELECT UNIX_TIMESTAMP('2026-11-08 14:30:00');
SELECT UNIX_TIMESTAMP();
Beide Funktionen verwenden die Zeitzone der Verbindung (time_zone), die standardmäßig der Systemzeitzone des Servers (SYSTEM) entspricht. Stellen Sie diese zu Beginn der Verbindung auf UTC ein: SET time_zone = '+00:00';. Die benannten Zeitzonen (z. B. 'Europe/Budapest') funktionieren erst nach dem Laden der Zeitzonentabellen (mariadb-tzinfo-to-sql), andernfalls erhalten Sie die Fehlermeldung Unknown or incorrect time zone. MariaDB 10.11 gibt für Zeitstempel nach dem 19. Januar 2038 den Wert NULL zurück (siehe unten). Informationen zur Installation von MariaDB finden Sie in der Anleitung zur Installation des MariaDB-Datenbankservers.
JavaScript
Date.now(); // Millisekunden
Math.floor(Date.now() / 1000); // Sekunden
new Date(1767225600 * 1000).toISOString(); // "2026-01-01T00:00:00.000Z"
Das JavaScript-Objekt Date rechnet in Millisekunden; daher muss ein Zeitstempel in Sekunden mit 1000 multipliziert und der Wert von Date.now() dividiert werden, bevor er an ein serverseitiges Programm übergeben wird.
macOS und BSD: date -r
Der Befehl date funktioniert unter macOS- und BSD-Systemen anders: Anstelle von -d @... erwartet der Schalter -r einen Unix-Zeitstempel, und aus dem Datum wird mit den Schaltern -j -f ein Zeitstempel erstellt:
# macOS / BSD
date -r 1767225600
date -u -r 1767225600 '+%Y-%m-%d %H:%M:%S'
date -j -f '%Y-%m-%d %H:%M:%S' '2026-11-08 14:30:00' +%s
Unter Linux (GNU date) gibt der Schalter -r das Änderungsdatum einer Datei aus; daher führt der Befehl date -r 1767225600 dort zu der Fehlermeldung No such file or directory.
Unter Ubuntu 26.04 ist der Befehl date Teil der in Rust geschriebenen uutils coreutils. Die in der Anleitung genannten GNU-date-Befehle lieferten im Test dasselbe Ergebnis; sollten Sie dennoch Abweichungen feststellen, ist die GNU-Version auch unter dem Namen gnudate verfügbar.
Das Jahr-2038-Problem
Ältere Systeme speichern den Zeitstempel als vorzeichenbehaftete 32-Bit-Ganzzahl, deren größter Wert 2147483647 beträgt, was dem 19. Januar 2038 um 03:14:07 UTC entspricht. Eine Sekunde später läuft die Zahl über, und das Datum lautet dann 13. Dezember 1901.
64-Bit-Linux-Systeme und der Befehl date sind davon nicht mehr betroffen (der Befehl date -u -d @2147483648 gibt problemlos den 19. Januar 2038, 03:14:08 Uhr aus); das Problem besteht vielmehr weiterhin bei älteren 32-Bit-Programmen und Datenbanken:
- Spalten vom Typ
INT, in denen Zeitstempel gespeichert werden: Verwenden Sie stattdessenBIGINToderDATETIME; - Der Spaltentyp
TIMESTAMPin MySQL und MariaDB, der Datumsangaben bis zum Jahr 2038 speichert; im Test lieferte auch der Aufruf vonFROM_UNIXTIME(2147483648)in MariaDB 10.11 den WertNULL. Laut Dokumentation funktionieren ab MariaDB 11.5 auf 64-Bit-Systemen der DatentypTIMESTAMPsowie diese Funktionen bis zum Jahr 2106; ab MySQL 8.0.28 funktionierenFROM_UNIXTIME()undUNIX_TIMESTAMP()bis zum Jahr 3001, der DatentypTIMESTAMPhingegen weiterhin nur bis zum Jahr 2038.
Zeitzone und genaue Uhrzeit auf dem Server
Die Umrechnung liefert nur dann ein korrektes Ergebnis, wenn die Serveruhr genau geht und die Zeitzone dem erwarteten Wert entspricht. Informationen zur Überprüfung und Einstellung finden Sie in unserer Anleitung zur Konfiguration von Hostname, Zeitzone und Zeitsynchronisation. Auch geplante Aufgaben werden nach der lokalen Serverzeit ausgeführt; weitere Informationen hierzu finden Sie im Artikel Crontab-Syntax und geplante Aufgaben unter Linux.
