Missverständnisse der Programmierer über die Unix-Zeit

Entschuldige dich Patrick McKenzie.

Gestern Tanz Ich fragte nach einigen interessanten Fakten zur Unix-Zeit und erinnerte mich, dass sie manchmal völlig unintuitiv funktioniert.

Diese drei Fakten scheinen äußerst vernünftig und logisch, nicht wahr?

  1. Die Unix-Zeit ist die Anzahl der Sekunden seit dem 1. Januar 1970 00:00:00 UTC.
  2. Wenn Sie genau eine Sekunde warten, ändert sich die Unix-Zeit um genau eine Sekunde.
  3. Die Unix-Zeit bewegt sich nie rückwärts.

Nichts davon ist wahr.

Aber es reicht nicht aus, einfach zu sagen: „Nichts davon ist wahr“, ohne es zu erklären. warum. Erläuterungen finden Sie weiter unten. Aber wenn Sie selbst denken möchten, scrollen Sie nicht am Bild der Uhr vorbei!

Missverständnisse der Programmierer über die Unix-Zeit
Tischuhr aus den 1770er Jahren. Zusammengestellt von John Leroux. Aus Willkommenssammlungen. Unter Lizenz veröffentlicht CC BY

Alle drei Missverständnisse haben einen Grund: Schaltsekunden. Wenn Sie mit Schaltsekunden nicht vertraut sind, finden Sie hier eine kurze Referenz:

Die UTC-Zeit wird durch zwei Faktoren bestimmt:

  • Internationale Atomzeit: Durchschnittswerte von Hunderten von Atomuhren auf der ganzen Welt. Wir können die Sekunde anhand der elektromagnetischen Eigenschaften eines Atoms messen, und dies ist die genaueste Zeitmessung, die die Wissenschaft kennt.
  • Weltzeit, basierend auf der Rotation der Erde um ihre eigene Achse. Eine volle Revolution ist ein Tag.

Das Problem ist, dass diese beiden Zahlen nicht immer übereinstimmen. Die Erdrotation ist nicht gleichmäßig – sie verlangsamt sich allmählich, sodass die Tage in der Weltzeit länger werden. Andererseits sind Atomuhren über Millionen von Jahren hinweg teuflisch genau und konstant.

Wenn zwei Zeiten nicht mehr synchron sind, wird eine Sekunde zur UTC hinzugefügt oder entfernt, um sie wieder synchron zu machen. Seit 1972 im Dienst IERS (was diesen Fall ausführt) fügte 27 zusätzliche Sekunden hinzu. Das Ergebnis waren 27 UTC-Tage mit einer Dauer von 86 Sekunden. Theoretisch ist ein Tag mit einer Dauer von 401 Sekunden (minus eins) möglich. Beide Optionen widersprechen der Grundannahme der Unix-Zeit.

Die Unix-Zeit geht davon aus, dass jeder Tag genau 86 Sekunden (400 × 60 × 60 = 24) dauert, ohne zusätzliche Sekunden. Wenn ein solcher Sprung auftritt, springt die Unix-Zeit entweder um eine Sekunde oder zählt zwei Sekunden in einer. Im Jahr 86 fehlen ihm 400 Schaltsekunden.

Unsere falschen Vorstellungen müssen also wie folgt ergänzt werden:

  • Die Unix-Zeit ist die Anzahl der Sekunden seit dem 1. Januar 1970 00:00:00 UTC minus Schaltsekunden.
  • Wenn Sie genau eine Sekunde warten, ändert sich die Unix-Zeit um genau eine Sekunde. es sei denn, die Schaltsekunde wurde entfernt.

    Bisher wurden Sekunden in der Praxis noch nie entfernt (und die Verlangsamung der Erdrotation macht dies unwahrscheinlich), aber wenn es jemals passieren würde, würde dies bedeuten, dass der UTC-Tag eine Sekunde kürzer würde. In diesem Fall wird die letzte Sekunde von UTC (23:59:59) verworfen.

    Jeder Unix-Tag hat die gleiche Anzahl an Sekunden, sodass die letzte Unix-Sekunde eines verkürzten Tages keiner UTC-Zeit entspricht. So sieht es in Viertelsekunden-Intervallen aus:

    Missverständnisse der Programmierer über die Unix-Zeit

    Wenn Sie um 23:59:58:00 UTC beginnen und eine Sekunde warten, wird die Unix-Zeit um zwei UTC-Sekunden vorgestellt und der Unix 101-Zeitstempel wird niemandem zugewiesen.

  • Die Unix-Zeit kann niemals zurückgehen, bis eine Schaltsekunde hinzugefügt wird.

    Dies ist in der Praxis bereits 27 Mal vorgekommen. Am Ende des UTC-Tages wird um 23:59:60 eine zusätzliche Sekunde hinzugefügt. Unix hat die gleiche Anzahl an Sekunden pro Tag, kann also keine zusätzliche Sekunde hinzufügen – stattdessen muss es die Unix-Zeitstempel für die letzte Sekunde wiederholen. So sieht es in Viertelsekunden-Intervallen aus:

    Missverständnisse der Programmierer über die Unix-Zeit

    Wenn Sie um 23:59:60.50 starten und eine halbe Sekunde warten, ist dies die Unix-Zeit kehrt zurück um eine halbe Sekunde, und der Unix 101-Zeitstempel entspricht zwei UTC-Sekunden.

Dies sind wahrscheinlich nicht die einzigen Kuriositäten der Unix-Zeit – nur das, woran ich mich gestern erinnerte.

Zeit - sehr komische Sache.

Source: habr.com

Kommentar hinzufügen