Verstrichene Zeit seit der Epoche
(aphyr.com)- POSIX time/Unix time wird oft als Anzahl der Sekunden seit 1970-01-01 00:00:00 bezeichnet, ist tatsächlich aber ein UTC-basierter Wert, der Schaltsekunden ignoriert und daher von den tatsächlich verstrichenen Sekunden abweicht
- Zum Zeitpunkt 2024-12-25 18:51:26 UTC beträgt die POSIX time 1735152686, während seit der Epoch tatsächlich 1735152713 Sekunden verstrichen sind – eine Differenz von 27 Sekunden
- IEEE 1003.1 rechnet bei der Definition von
seconds since the Epochjeden Tag stets mit 86.400 Sekunden; auch der Anhang des Standards ignoriert die seit 1970 hinzugefügten 14 Schaltsekunden zugunsten von Kompatibilität und einfacher Berechnung - UTC fügt Schaltsekunden hinzu, um die Abweichung vom Sonnentag zu verringern; dabei springt die POSIX time zurück, was zu Ausfällen wie bei Linux, Qantas und Cloudflare DNS geführt hat
- Für die Messung von Zeitintervallen auf einem einzelnen Computer sind
CLOCK_MONOTONICoderCLOCK_BOOTTIMEbesser; wenn Abgleich mit POSIX timestamps nötig ist, sollte man leap smear oder POSIX↔TAI-Konvertierung in Betracht ziehen
POSIX time ist nicht die tatsächlich verstrichene Sekundenzahl
- JavaScript
Date, GNU coreutils, Linuxtime(2), Gotime.Unix, MySQLdatetime, RubyTime, Cassandratimestampusw. behandeln POSIX time häufig wie die Sekunden seit der Unix epoch - Diese Formulierung entspricht jedoch nicht ganz der üblichen Intuition
- Beispielzeitpunkt: 2024-12-25 18:51:26 UTC
- POSIX time: 1735152686
- Tatsächlich verstrichene Sekunden seit der POSIX epoch: 1735152713
- Differenz: 27 Sekunden
- Diese Differenz entsteht, weil POSIX time in IEEE 1003.1 zwar von UTC abgeleitet ist, aber für jeden Tag exakt 86.400 Sekunden annimmt
- Die Definition von
seconds since the Epochim Standard berechnet den Wert anhand vontm_sec,tm_min,tm_hour,tm_ydayundtm_year; die Beziehung zu Jahren vor 1970 oder zu negativen Werten ist nicht definiert - Die tatsächliche Länge eines Tages beträgt nicht immer 86.400 Sekunden und ändert sich über die Zeit
- Damit UTC-Daten nicht zu weit vom Sonnentag abweichen, erklären Astronomen periodisch Schaltsekunden
- Dadurch kann POSIX time alle paar Jahre rückwärts springen
- Irgendwann könnte sie auch vorwärts springen
- Schaltsekunden haben bereits zu realen Ausfällen geführt
- Schaltsekundenproblem im Zusammenhang mit dem Linux-Kernel
- Verzögerungen bei Qantas durch einen Linux-Schaltsekunden-Bug
- Auswirkungen der Schaltsekunde auf Cloudflare DNS
Kompromisse im Standard und praktische Alternativen
- Anhang B von IEEE 1003 hält fest, dass zum Zeitpunkt der Veröffentlichung des Standards seit 1970-01-01 14 Schaltsekunden hinzugefügt worden waren, diese 14 Sekunden aber zugunsten einfacher Berechnung und Kompatibilität ignoriert werden
- Der Standard geht davon aus, dass der „time“-Wert der meisten Systeme kontinuierlich steigt, und entscheidet sich dafür, dass dieser Wert auch während einer Schaltsekunde steigen soll
- Gleichzeitig setzt er voraus, dass die meisten Systeme Schaltsekunden nicht verfolgen oder möglicherweise nicht mit einer Standardzeitbasis synchronisiert sind
- Daher verlangt er nicht, dass
seconds since the Epochzwingend die exakte Anzahl der Sekunden zwischen Referenzzeitpunkt und epoch darstellt - Es genügt, wenn Anwendungen diesen Wert wie Sekunden seit der epoch behandeln können; die erforderliche Genauigkeit sollen Systemanbieter und Administratoren sicherstellen
- In verteilten Anwendungen kann eine konsistente Interpretation wichtig werden, weil Events über timestamps synchronisiert werden
- Die Ansammlung von Schaltsekunden ist nicht vorhersagbar
- Die Zahl der Schaltsekunden seit der epoch kann weiter steigen
- Der Standard interessiert sich stärker für Zeitsynchronisierung zwischen Anwendungen über astronomisch kurze Zeiträume
- Reale Systeme funktionieren meist auch bei leicht abweichender Zeit, doch Schaltsekunden sind selten, und die lineare Intuition von „Sekunden seit der epoch“ ist stark – dadurch können sich unentdeckte Bugs ansammeln
- Je nach Situation bieten sich folgende Alternativen an
- Wenn auf einem Computer nur die duration zwischen zwei Events berechnet werden soll:
CLOCK_MONOTONIC, besser nochCLOCK_BOOTTIME, verwenden - Wenn keine timestamps mit anderen Systemen ausgetauscht werden müssen, die POSIX time voraussetzen: TAI, GPS, LORAN verwenden
- Wenn eine grobe Abstimmung mit POSIX-timestamp-Systemen nötig ist: Schaltsekunden per leap smear über einen längeren Zeitraum verteilen
- Mit Bibliotheken wie qntms t-a-i ist eine Konvertierung zwischen POSIX und TAI möglich
- Wenn auf einem Computer nur die duration zwischen zwei Events berechnet werden soll:
- Es laufen Bemühungen zur Abschaffung von Schaltsekunden, deren Umsetzung bis 2035 erwartet wird
- Für alles, was auf der Annahme
ein Tag hat 86.400 Sekundenberuht, ist zusätzlicher Aufwand nötig, um Konvertierungstabellen einzubauen - Für Zeitpunkte nach 2035 könnten Fragen wie „Wie viele Sekunden liegen zwischen zwei Zeitpunkten?“ deutlich einfacher werden
- Für alles, was auf der Annahme
1 Kommentare
Hacker-News-Kommentare
Ich habe gerade Vernor Vinges SF-Roman A Deepness in the Sky aus dem Jahr 2000 gelesen; ein großartiges Buch mit einer unerwarteten Erwähnung von Sekunden seit der Epoch (seconds since the epoch).
Es beginnt mit „Betrachten Sie die Art, wie die Traders Zeit messen …“ und beschreibt, dass die Qeng Ho in Sekunden ab dem Moment zählen, in dem die Menschheit erstmals den Mond der Old Earth betrat; bei genauerem Hinsehen liegt der Startpunkt aber tatsächlich etwa 15 Millionen Sekunden später, beim Zeitpunkt null eines der frühen Computerbetriebssysteme der Menschheit.
Wenn man mehr „Informatik im Weltraum“ möchte, empfehle ich die Bobiverse-Reihe; wenn man mehr Erkundung von „Mensch + Simulation + Computer“ möchte, Permutation City.
Jedes Mal, wenn ich über Zeitmessung lese, lerne ich unweigerlich etwas Neues. Ich hatte Unix-Zeit immer für die einfachste Art gehalten, Zeit zu verfolgen, wenn man nur Rollovers berücksichtigt, und Schaltsekunden kannte ich zwar, aber ich hatte nicht daran gedacht, dass sie auch hier gelten.
Ich habe auch den Link „UTC, GPS, LORAN and TAI“ gelesen; der Kontrast, dass GPS-Zeit Schaltsekunden nicht berücksichtigt, ist interessant.
Der Plan, „bis 2035 Schaltsekunden abzuschaffen“, gefällt mir nicht besonders.
Der Kern von UTC ist, dass es um eine ganze Zahl von Sekunden von TAI abweicht und der mittleren Sonnenzeit (MST) nahekommt. Wenn man MST nicht mehr verfolgen will, sollte man einfach auf TAI umstellen.
Lässt man UTC von MST wegdriften, muss man die historischen Schaltsekunden weiterhin behandeln, aber diese Schaltsekunden haben dann keinen Zweck mehr – ein halbgarer Zustand.
Allerdings ist dieser Vorschlag nicht völlig sinnlos. Ziel ist, die bestehende UTC-Zeitverwaltung nicht zu ändern, sondern dafür zu sorgen, dass die Differenz zwischen zwei Zeitstempeln nach 2035 der exakten Anzahl physikalischer Sekunden entspricht.
Trotzdem wirkt es lächerlich, MST zu entfernen, da es bereits eine Funktion von UTC ist.
In der Realität haben jedoch viele Systeme die falsche Wahl getroffen, insbesondere UNIX ist der Hauptgrund. Diese Entscheidung ist so tief in unzähligen Systemen und Vorschriften verankert, dass ein „einfacher Wechsel zu TAI“ praktisch unmöglich ist.
Deshalb ist es einfacher, UTC als „neues TAI“ neu zu interpretieren. Es würde mich nicht überraschen, wenn das frühere UTC irgendwann unter einem anderen Namen wieder auftaucht.
In den meisten oder allen Ländern basiert die zivile Zeit auf UTC. Niemand wird die Uhren der ganzen Welt um etwa 30 Sekunden zurückstellen, nur weil das etwas reiner wäre.
Auch die GPS-Zeit hat einen Offset zu TAI, aber niemand kümmert sich groß darum. Dasselbe gilt für die Unix-Epoch; solange die Ergebnisse konsistent sind, reicht das.
Leap_Secondanlegen. Jeden Monat prüfen, ob diese Datei existiert; wenn ja, sie löschen, den Wert in der DateiLeap_Secondsum 1 erhöhen und ein Backup namensLSSEerstellen.„You are not expected to understand this.“ So hält man beide Systeme aufrecht. Wenn man will, kann man es auch mit Hashes oder Lookup-Tabellen bauen.
Wichtig ist auch, dass die moderne UTC-Epoch der 1. Januar 1972 ist. Davor verwendete UTC eine andere Sekundenlänge als TAI.
Ende 1971 gab es als Zwischenschritt einen letzten unregelmäßigen Sprung von exakt 0,107758 TAI-Sekunden, und die kleinen Zeitschritte sowie Frequenzanpassungen von UTC oder TAI zwischen 1958 und 1971 wurden so abgestimmt, dass ihre Summe genau 10 Sekunden ergab. Daher war der 1. Januar 1972, 00:00:00 UTC, exakt der 1. Januar 1972, 00:00:10 TAI, und seitdem beträgt die Differenz eine ganze Zahl von Sekunden.
Gleichzeitig wurde die Tickrate von UTC exakt gleich der von TAI, und UTC begann, UT1 statt UT2 zu verfolgen. Daher stimmt die Unix-Zeit der Jahre 1970 und 1971 nicht mit der tatsächlichen UTC-Zeit jener Zeit überein.
https://en.wikipedia.org/wiki/Coordinated_Universal_Time#His...
https://en.wikipedia.org/wiki/Unix_time#UTC_basis
Selbst wenn man annimmt, dass die Uhrzeit in der Geburtsurkunde sekundengenau ist, gilt das. Denn während eines Teils ihres Lebens war der Wert, der als „Länge einer Sekunde“ galt, im Vergleich zu dem, was wir heute gewöhnlich unter einer Sekunde verstehen, ziemlich anders.
Mit Sekunde ist hier die Sekunde gemeint, die auf der ungestörten Hyperfeinübergangsfrequenz des Grundzustands des Cäsium-133-Atoms von 9.192.631.770/s basiert.
Ich habe kürzlich Code für eine Börse geschrieben; das System lief auf VAX, genauer gesagt auf OpenVMS, und die Epoch war der 17. November 1858.
Es war das erste Mal in meiner Laufbahn, dass ich eine nicht-Unix-Epoch gesehen habe; zum Glück war sie im verwendeten Code auf die Unix-Epoch abstrahiert.
https://www.slac.stanford.edu/~rkj/crazytime.txt
Um diese Daten in den Computerspeicher der 1950er-Jahre passen zu lassen, wurde der Kalender um 2,4 Millionen Tage versetzt; dadurch wurde Tag 0 zum 17. November 1858.
https://www.joelonsoftware.com/2006/06/16/my-first-billg-rev...
Die macOS/Swift-Foundation-API
NSDate.timeIntervalSinceReferenceDateverwendet den 1. Januar 2001 als Epoch.Wikipedia hat ebenfalls eine nützliche Liste: https://en.wikipedia.org/wiki/Epoch_(computing)#Notable_epoc...
Manche Zeitpunkte lassen sich nicht als POSIX-Zeitstempel darstellen, und manche POSIX-Zeitstempel entsprechen keiner realen Zeit.
Das ist ungefähr so, als würde man sagen, es gebe Zeitpunkte ohne ISO-8601-Jahr. Jeder Zeitpunkt hat ein Jahr, nur sind manche Jahre länger als andere.
Wenn man sich hinsetzt und https://time.is/UTC anschaut, wird die Zeit monoton steigen; gelegentlich ist nur eine Sekunde ein ganz kleines bisschen länger. Zum Beispiel über 24 Stunden hinweg etwa 0,001 % länger.
Wenn ich Datumsangaben in einer Datenbank speichere, speichere ich sie immer als Unix-Epoch-Zeit und hinterlege in Datumsfeldern keine Zeitzoneninformationen. Wenn es eine Anforderung gibt, die Zeitzone zu kennen, speichere ich sie separat.
Ich frage mich, ob man stattdessen Zeitstempel im TAI-Format speichern und bei Bedarf Funktionen zur Umwandlung nach UTC verwenden sollte, damit erdbezogene Korrekturen bei Bedarf behandelt werden können.
Mir ist klar, dass Zeitzonen ein Minenfeld sind, aber auch sie sind ein menschliches Konstrukt, dessen Grenzen sich im Lauf der Zeit ändern. Es scheint, als sollte man auf absolute Zeit fixieren und sie dann bei Bedarf im gewünschten lokalen Zeitformat rendern.
Schaltsekundenkorrekturen sollten an derselben Stelle stattfinden wie Zeitzonenumwandlungen. Leider hat Unix das Falsche standardisiert, und Migrationen sind schwierig.
Daher sind alle Uhren ohnehin auf UTC ausgerichtet. Beim Speichern müsste man von UTC nach TAI konvertieren und beim Lesen wieder zurück; das würde ein Durcheinander geben.
Üblicherweise haben Datenbanken entweder kein Zeitzonenkonzept für gespeicherte Zeitstempel (SQL Server) oder sie bieten einen „zeitzonenbewussten“ Zeitstempeltyp, konvertieren die Eingabe aber nach UTC und verwerfen die ursprüngliche Zeitzone (MySQL, Postgres).
Soweit ich weiß, kann nur Oracle bei
with time zone-Typen eine nicht-lokale Zeitzone tatsächlich rundtripfähig bewahren.Bei manchen Berechnungen ist eine Abweichung von 1 Sekunde ein großes Problem. Wenn man etwas anderes als das am weitesten verbreitete Format übernimmt, sollte man vorsichtig sein und einen guten Grund haben, vom Standard abzuweichen. Schon die bloße Tatsache, anders zu sein, kann hohe Kosten verursachen.
Durch diesen Artikel fühlt es sich an, als sei Weihnachten ruiniert. Ist denn nichts heilig? Sekunden sollten Sekunden seit der Epoch sein.
Ich verstehe nicht, warum man sich darum kümmern sollte, dass das ein wenig vom Sonnentag abweicht. Sollte nicht der Konverter, der Sekunden seit der Epoch in eine Datumsdarstellung umwandelt, für die Korrektur verantwortlich sein?
Wir wollen nicht, dass jede Software die Einführung von Schaltsekunden fest eincodiert, Smearing behandelt und innerhalb eines Monats eine Update-Methode benötigt, wenn eine neue Schaltsekunde eingeführt wird.
Bisher mussten wir uns darum weder sorgen noch darüber nachdenken, und das müssen wir auch künftig nicht. Es wird auf die richtige Weise behandelt.
Schaltsekunden sollte man durch riesige Raketen am Äquator ersetzen. Nicht die Uhren anpassen, sondern den Planeten.
In der islamischen Überlieferung über das Ende der Welt und den Antichristen (Dajjal) gibt es auch eine Stelle, in der so etwas tatsächlich geschieht. Es heißt: „Der erste Tag des Antichristen wird wie ein Jahr sein, der zweite Tag wie ein Monat und der dritte Tag wie eine Woche.“ Viele verstehen das wörtlich, also als kosmisches Ereignis, bei dem die Erdrotation tatsächlich langsamer wird und sich schließlich umkehrt, sodass die Sonne im Westen aufgeht. Das ist das letzte Zeichen für das Ende der Menschheit.
Ich frage mich, was es ausmacht, wenn die Epoche wegen Schaltsekunden 29 Sekunden länger zurückliegt, als
date +%simpliziert.Viel wichtiger ist, dass sich alle auf irgendeine Zahl N einigen, die die aktuelle Zeit darstellt. Eine hypothetische Differenz von -29 Sekunden wirkt sich nicht auf die reale Welt aus. Man wird ja wohl keine Raketen-Zielroutine auf ein Ziel von vor 30 Jahren laufen lassen.
Ich bin für die Abschaffung von Schaltsekunden, halte es aber nicht für hilfreich, die Zeitabweichung zu betonen. Auch wenn es streng genommen stimmt.
Wichtiger sind die Auswirkungen auf die Zukunft. Dass frühere Timestamps um ein paar Sekunden von einer einfachen Rechnung „jetzt - N Sekunden“ abweichen können, ist meist eher eine interessante Tatsache; wichtiger ist, dass zu irgendeinem künftigen Zeitpunkt möglicherweise alle Uhren erneut um eine Sekunde verschoben werden müssen. Es gibt viele reale Fälle, in denen es erheblichen Aufwand erfordert, das zu berücksichtigen.