Unix-Zeitstempel und Epoch-Zeit verstehen
Unix-Epoche, Zeiteinheiten, UTC, Ganzzahlgenauigkeit, Grenzen 2038 und 2106 sowie Schaltsekunden mit Codebeispielen verstehen.
Ein Zeitstempel ordnet ein Ereignis einer Zeitskala zu. Für den Austausch müssen Epoche, Einheit und Uhrenart feststehen. Ein Zähler seit dem Start ist keine UTC-Datumsangabe. Mit Unix-Timestamp / Epoch-Konverter lassen sich Werte und Zeitzonen vollständig im Browser untersuchen.
Unix-Epoche und das Jahr 1970
Der Ursprung ist 1970-01-01 00:00:00 UTC. Diese historische Unix-Konvention bezeichnet keinen physikalischen Beginn der Zeit. Eine andere Epoche verändert die Zahl, nicht das Ereignis. NTP beginnt 1900; GPS und herstellerspezifische Zähler verwenden andere Regeln. Eine Zahl allein verrät ihre Epoche nicht.
Zählweise und negative Werte
In der gewöhnlichen POSIX-Kalenderrechnung hat ein nominaler UTC-Tag 86400 Sekunden. Der nächste UTC-Tagesbeginn nach der Epoche entspricht 86400. Ein örtlicher Kalendertag muss deshalb nicht 24 Stunden dauern. Positive Werte liegen nach der Epoche; −1 ist die letzte Sekunde von 1969. Der Zahlenwert enthält keine Zeitzone.
Sekunden bis Nanosekunden
| Zeitstempeleinheit | 1 s | 1700000000 s |
|---|---|---|
| Sekunden (s) | 1 | 1700000000 |
| Millisekunden (ms) | 1000 | 1700000000000 |
| Mikrosekunden (µs) | 1000000 | 1700000000000000 |
| Nanosekunden (ns) | 1000000000 | 1700000000000000000 |
Sekunden werden mit 1000 in Millisekunden und mit einer Milliarde in Nanosekunden umgerechnet. Zusätzliche Nullen verbessern die Uhrengenauigkeit nicht. JavaScript Date erwartet Millisekunden; zahlreiche C-Schnittstellen erwarten Sekunden. Benennen Sie die Einheit ausdrücklich im Datenfeld.
UTC, Verschiebung und IANA-Zone
2023-11-14 22:13:20 UTC entspricht 23:13:20 in Paris. +01:00 ist eine konkrete Verschiebung; Europe/Paris bezeichnet zeitabhängige zivile Regeln. Abkürzungen wie CST sind regional mehrdeutig.
Zeitumstellung: Lücke und Wiederholung
2024-03-31 02:30 existiert in Paris nicht. 2024-10-27 02:30 entspricht dagegen entweder 00:30 UTC oder 01:30 UTC. Der Konverter lehnt Lücken ab und lässt die frühere oder spätere Wiederholung auswählen. Der Tag des Jahres wird aus örtlichen Kalenderfeldern bestimmt, ohne eine örtliche Dauer durch 24 Stunden zu teilen. Die Regeln stammen aus der IANA-Datenbasis des Browsers; historische Daten und zukünftige politische Änderungen haben Grenzen.
Durchgerechnetes Beispiel und Referenzwerte
1700000000 s × 1000 ergibt 1700000000000 ms, jeweils 2023-11-14T22:13:20Z. Weitere 123456789 ns ergeben 1700000000123456789 ns mit der Sekundennachkommastelle .123456789. Date zeigt davon .123; der Konverter bewahrt die übrigen 456789 ns separat.
| Unix-Sekunden | ISO 8601 (UTC) |
|---|---|
| -1 | 1969-12-31T23:59:59Z |
| 0 | 1970-01-01T00:00:00Z |
| 1000000000 | 2001-09-09T01:46:40Z |
| 1700000000 | 2023-11-14T22:13:20Z |
| 2147483647 | 2038-01-19T03:14:07Z |
| 4294967295 | 2106-02-07T06:28:15Z |
−1 ns ist 1969-12-31T23:59:59.999999999Z. Die enthaltende Millisekunde ist −1 ms. Ganzzahldivision zum Nullpunkt würde fälschlich die Epoche anzeigen. Runden Sie den Quotienten nach unten und bewahren Sie den Rest.
2038: vorzeichenbehaftete 32-Bit-Sekunden
Der Bereich reicht von −2³¹ bis 2³¹−1. 2147483647 entspricht 2038-01-19T03:14:07Z. Die nächste Sekunde passt nicht mehr. Ein vorzeichenbehafteter Überlauf in C ist undefiniertes Verhalten; ein vermeintlicher Sprung nach 1901 ist keine zulässige Annahme. Erweitern Sie Operanden vor der Rechnung und prüfen Sie Datei- sowie Protokollfelder.
2106: vorzeichenlose 32-Bit-Sekunden
0 bis 4294967295 endet bei 2106-02-07T06:28:15Z. Negative Zeitstempel sind nicht direkt darstellbar. Ein Wechsel zu unsigned verschiebt die Grenze und ändert die Semantik; er ersetzt keine dauerhafte Formatmigration.
64 Bit und numerische Genauigkeit
Vorzeichenbehaftete 64-Bit-Sekunden umfassen etwa 292 Milliarden Jahre je Richtung, Nanosekunden bei gleicher Breite nur etwa 292 Jahre, positiv bis 2262. Kalenderbibliotheken können engere Grenzen haben. Binary64 bildet alle Ganzzahlen nur bis 2⁵³−1 exakt ab. Aktuelle Nanosekundenwerte benötigen in JavaScript BigInt oder Dezimalzeichenfolgen. Ein 32-Bit-Gleitkommawert ist kein exakter 32-Bit-Sekundenzähler.
Schaltsekunden und POSIX
POSIX zählt nicht jede tatsächlich vergangene SI-Sekunde seit 1970 und vergibt keinen gewöhnlichen eindeutigen Zeitstempel an UTC :60. Systeme können bei einer Einfügung springen, wiederholen oder glätten. Ein zeitlos konstanter Offset zu TAI oder GPS ist unzulässig. Für garantierte physikalische Laufzeiten ist eine zivile Uhr ungeeignet.
JavaScript / TypeScript
const timestampNs = BigInt("1700000000123456789");
const divisor = BigInt(1_000_000);
const q = timestampNs / divisor;
const ms = timestampNs < 0 && timestampNs % divisor !== BigInt(0)
? q - BigInt(1) : q;
if (ms < BigInt("-8640000000000000") || ms > BigInt("8640000000000000")) {
throw new RangeError("Date");
}
const iso = new Date(Number(ms)).toISOString();
console.log(iso);
console.log(timestampNs.toString());
Date zeigt 2023-11-14T22:13:20.123Z; die ursprüngliche Ganzzahl bleibt vollständig erhalten. Der Konverter prüft vor Date die gesamte Nanosekundenzahl und ergänzt die exakte ISO- und RFC-3339-Fraktion separat. RFC 3339 verwendet vierstellige Jahre; außerhalb 0000–9999 ist diese Ausgabe nicht verfügbar. RFC 2822 zeigt ganze Sekunden ab dem Jahr 1900.
Python ohne Gleitkommaumweg
from datetime import datetime, timezone, timedelta
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
instant = datetime(2023, 11, 14, 22, 13, 20, 123456, tzinfo=timezone.utc)
delta = instant - epoch
timestamp_us = ((delta.days * 86400 + delta.seconds) * 1_000_000
+ delta.microseconds)
restored = epoch + timedelta(microseconds=timestamp_us)
assert restored == instant
print(timestamp_us, restored.isoformat())
Explizites UTC vermeidet die lokale Rechnerzone. timedelta erhält hier ganzzahlige Mikrosekunden. timestamp() liefert einen möglicherweise gerundeten Gleitkommawert; datetime speichert keine Nanosekunden. IANA-Zonen benötigen zoneinfo und eine Regel für wiederholte Ortszeiten.
C und eingebettete Speicherung
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
int main(void) {
int64_t seconds = INT64_C(1700000000);
int64_t milliseconds = seconds * INT64_C(1000);
int64_t after_2038 = (int64_t)INT32_MAX + INT64_C(1);
printf("%" PRId64 " %" PRId64 "\n", milliseconds, after_2038);
return 0;
}
Die gezeigten Produkte passen in int64_t. Allgemeiner Code muss vor Multiplikation Grenzen prüfen. Eine 64-Bit-CPU garantiert kein 64-Bit-time_t. Dessen rohe Serialisierung hängt von ABI und Byte-Reihenfolge ab. Definieren Sie Breite, Vorzeichen, Einheit und Epoche im Protokoll. Weitere Beispiele enthält Unix-Zeitstempel in eingebetteten Systemen, APIs und Datenbanken.
Häufige Fehler
- Sekunden direkt an Date übergeben oder die Einheit aus der Ziffernzahl erraten.
- Eine lange Zeichenfolge vor BigInt in Number umwandeln und bereits gerundete Ziffern übernehmen.
- Den Zonenoffset zweimal addieren.
- Den 31. Februar durch automatische Normalisierung akzeptieren.
- Anzeigeauflösung mit tatsächlicher Uhrengenauigkeit gleichsetzen.
Technische FAQ
Verändert eine andere Zone den Zeitstempel?
Nein, nur dessen Kalenderdarstellung. Neue örtliche Eingabefelder müssen dagegen mit einer Zone interpretiert werden.
Sind negative Bruchteile erlaubt?
Ja. −0.5 s liegt eine halbe Sekunde vor der Epoche. Vorzeichen und Rest müssen bei der Einheitenumrechnung erhalten bleiben.
Ist die aktuelle Uhr ein Netzwerkzeitdienst?
Nein. Sie liest die Geräteuhr ohne NTP-Abfrage; deren Synchronisierung bestimmt die Genauigkeit.
Werkzeuge und Quellen
Unix-Timestamp / Epoch-Konverter · Unix-Zeitstempel in eingebetteten Systemen, APIs und Datenbanken · Frequenztoleranz · PPM ↔ Hz.