Wanopvattings wat programmeerders oor Unix-tyd het

ek vra om verskoning Patrick McKenzie.

Gister Dannie het 'n paar interessante feite oor Unix-tyd gevra, en ek het onthou dat dit soms heeltemal onintuïtief werk.

Hierdie drie feite lyk by uitstek redelik en logies, nie waar nie?

  1. Unix-tyd is die aantal sekondes sedert 1 Januarie 1970 00:00:00 UTC.
  2. As jy presies een sekonde wag, sal Unix-tyd met presies een sekonde verander.
  3. Unix-tyd beweeg nooit agteruit nie.

Dit alles is nie waar nie.

Maar dit is nie genoeg om net te sê "Dit alles is nie waar nie" sonder om te verduidelik nie hoekom. Sien verduideliking hieronder. Maar as jy vir jouself wil dink, moenie die horlosie blaai nie!

Wanopvattings wat programmeerders oor Unix-tyd het
Tafelhorlosie uit die 1770's. Versamel deur John Leroux. Van Welkom versamelings. Gepubliseer onder lisensie CC BY

Al drie wanopvattings het dieselfde rede: sprong sekondes. As jy nie vertroud is met skrikkelsekondes nie, hier is 'n vinnige verwysing:

UTC-tyd word deur twee faktore bepaal:

  • Internasionale atoomtyd: gemiddelde lesings van honderde atoomhorlosies regoor die wêreld. Ons kan die tweede meet aan die elektromagnetiese eienskappe van die atoom, en dit is die mees akkurate meting van tyd wat aan die wetenskap bekend is.
  • Universele Tydgebaseer op die rotasie van die aarde om sy eie as. Een volle beurt is een dag.

Die probleem is dat hierdie twee getalle nie altyd ooreenstem nie. Die rotasie van die Aarde is nie konsekwent nie - dit vertraag geleidelik, sodat die dae in Universele Tyd langer word. Aan die ander kant is atoomhorlosies duiwels akkuraat en konstant vir miljoene jare.

Wanneer twee keer nie gesinkroniseer word nie, word 'n tweede bygevoeg of van UTC verwyder om dit terug te sinkroniseer. Diens sedert 1972 IERS (wie hierdie saak bestuur) het 27 ekstra sekondes bygevoeg. Die resultaat is 27 dae UTC met 'n duur van 86 401 sekondes. Teoreties is 'n dag met 'n duur van 86 399 sekondes (minus een) moontlik. Albei opsies weerspreek die fundamentele aanname van Unix-tyd.

Unix-tyd neem aan dat elke dag presies 86 400 sekondes lank is (60 × 60 × 24 = 86 400), met geen ekstra sekondes nie. As so 'n sprong plaasvind, dan slaan Unix-tyd óf 'n sekonde oor, óf tel twee sekondes in een. Vanaf 2019 ontbreek dit 27 skrikkelsekondes.

Ons dwalings moet dus soos volg aangevul word:

  • Unix-tyd is die aantal sekondes sedert 1 Januarie 1970 00:00:00 UTC minus skrikkel sekondes.
  • As jy presies een sekonde wag, sal Unix-tyd met presies een sekonde verander, tensy 'n skrikkelsekonde verwyder is.

    Tot dusver, in die praktyk, is sekondes nog nooit verwyder nie (en die verlangsaming van die Aarde se rotasie beteken dat dit onwaarskynlik is), maar as dit ooit sou gebeur, sou dit beteken dat die UTC-dag een sekonde korter geword het. In hierdie geval word die laaste sekonde van UTC (23:59:59) weggegooi.

    Elke Unix-dag het dieselfde aantal sekondes, dus sal die laaste Unix-sekonde van die verkorte dag nie met enige UTC-tyd ooreenstem nie. Hier is hoe dit lyk, in kwart-sekonde intervalle:

    Wanopvattings wat programmeerders oor Unix-tyd het

    As jy om 23:59:58:00 UTC begin en een sekonde wag, sal Unix-tyd twee sekondes UTC vorder, en Unix-tydstempel 101 sal aan niemand toegeken word nie.

  • Unix-tyd kan nooit teruggaan nie, totdat 'n skrikkelsekonde bygevoeg word.

    Dit het al 27 keer in die praktyk gebeur. Aan die einde van die UTC-dag word 'n ekstra sekonde om 23:59:60 bygevoeg. 'n Unix-dag het dieselfde aantal sekondes, dus kan dit nie 'n ekstra sekonde byvoeg nie - in plaas daarvan moet dit die Unix-tydstempels vir die laaste sekonde herhaal. Hier is hoe dit lyk, in kwart-sekonde intervalle:

    Wanopvattings wat programmeerders oor Unix-tyd het

    As ons om 23:59:60.50 begin en 'n halwe sekonde wag, die Unix-tyd terugkom 'n halwe sekonde, en die Unix-tydstempel 101 stem ooreen met twee sekondes UTC.

Dit is waarskynlik nie die enigste eienaardigheid van Unix-tyd nie, net wat ek gister onthou het.

Tyd - baie vreemde ding.

Bron: will.com

Voeg 'n opmerking