Misvattingen van programmeurs over Unix Time

Ik bied mijn excuses aan Patrick McKenzie.

Gisteren Danny Ik vroeg naar enkele interessante feiten over Unix-tijd, en ik herinnerde me dat het soms volkomen onintuïtief werkt.

Deze drie feiten lijken uiterst redelijk en logisch, nietwaar?

  1. Unix-tijd is het aantal seconden sinds 1 januari 1970 00:00:00 UTC.
  2. Als u precies één seconde wacht, verandert de Unix-tijd met precies één seconde.
  3. Unix-tijd gaat nooit achteruit.

Niets hiervan is waar.

Maar het is niet voldoende om eenvoudigweg te zeggen: “Dit is allemaal niet waar”, zonder het uit te leggen. waarom. Zie hieronder voor uitleg. Maar als je zelf wilt nadenken, scroll dan niet voorbij de afbeelding van de klok!

Misvattingen van programmeurs over Unix Time
Tafelklok uit de jaren 1770. Samengesteld door John Leroux. Van Welkom collecties. Gepubliceerd onder licentie CC BY

Alle drie de misvattingen hebben één reden: schrikkelseconden. Als u niet bekend bent met schrikkelseconden, volgt hier een korte referentie:

UTC-tijd wordt bepaald door twee factoren:

  • Internationale Atoomtijd: Gemiddelde metingen van honderden atoomklokken over de hele wereld. We kunnen de tweede meten aan de hand van de elektromagnetische eigenschappen van een atoom, en dit is de meest nauwkeurige meting van tijd die de wetenschap kent.
  • Wereldtijd, gebaseerd op de rotatie van de aarde om haar eigen as. Eén volledige revolutie is één dag.

Het probleem is dat deze twee getallen niet altijd overeenkomen. De rotatie van de aarde is niet consistent - deze vertraagt ​​geleidelijk, waardoor de dagen in Universele Tijd langer worden. Aan de andere kant zijn atoomklokken duivels nauwkeurig en constant gedurende miljoenen jaren.

Wanneer twee tijden niet synchroon lopen, wordt er een seconde toegevoegd aan of verwijderd uit UTC om ze weer synchroon te brengen. Sinds 1972 in dienst IERS (waarin deze casus wordt uitgevoerd) voegde 27 extra seconden toe. Het resultaat was 27 UTC-dagen met een duur van 86 seconden. Theoretisch is een dag met een duur van 401 seconden (min één) mogelijk. Beide opties zijn in tegenspraak met de fundamentele aanname van Unix-tijd.

Unix-tijd gaat ervan uit dat elke dag precies 86 seconden duurt (400 × 60 × 60 = 24), zonder extra seconden. Als zo'n sprong plaatsvindt, springt de Unix-tijd ofwel met één seconde, ofwel telt hij twee seconden in één. Vanaf 86 ontbreken er 400 schrikkelseconden.

Onze misvattingen moeten dus als volgt worden aangevuld:

  • Unix-tijd is het aantal seconden sinds 1 januari 1970 00:00:00 UTC minus schrikkelseconden.
  • Als je precies één seconde wacht, verandert de Unix-tijd met precies één seconde. tenzij de schrikkelseconde is verwijderd.

    Tot nu toe zijn in de praktijk nooit seconden verwijderd (en door de vertraging van de rotatie van de aarde is dit onwaarschijnlijk), maar als dit ooit zou gebeuren, zou dit betekenen dat de UTC-dag een seconde korter zou worden. In dit geval wordt de laatste seconde van UTC (23:59:59) weggegooid.

    Elke Unix-dag heeft hetzelfde aantal seconden, dus de laatste Unix-seconde van een verkorte dag komt niet overeen met een UTC-tijd. Zo ziet het eruit, in intervallen van een kwart seconde:

    Misvattingen van programmeurs over Unix Time

    Als je begint om 23:59:58:00 UTC en één seconde wacht, zal de Unix-tijd twee UTC-seconden vooruitgaan en zal de Unix 101-tijdstempel aan niemand worden toegewezen.

  • Unix-tijd kan nooit meer teruggaan, totdat er een schrikkelseconde wordt toegevoegd.

    In de praktijk is dit al 27 keer gebeurd. Aan het einde van de UTC-dag wordt een extra seconde toegevoegd om 23:59:60. Unix heeft hetzelfde aantal seconden per dag, dus het kan geen extra seconde toevoegen; in plaats daarvan moet het de Unix-tijdstempels voor de laatste seconde herhalen. Zo ziet het eruit, in intervallen van een kwart seconde:

    Misvattingen van programmeurs over Unix Time

    Als je begint om 23:59:60.50 en een halve seconde wacht, de Unix-tijd komt terug met een halve seconde, en de Unix 101-tijdstempel komt overeen met twee UTC-seconden.

Dit zijn waarschijnlijk niet de enige eigenaardigheden van Unix-tijden - precies wat ik me gisteren herinnerde.

Tijd - zeer vreemd ding.

Bron: www.habr.com

Voeg een reactie