Programmeerijate väärarusaamad Unixi aja kohta

ma vabandan Patrick McKenzie.

Eile Danny Küsisin huvitavate faktide kohta Unixi aja kohta ja mulle meenus, et mõnikord töötab see täiesti ebaintuitiivselt.

Need kolm fakti tunduvad äärmiselt mõistlikud ja loogilised, kas pole?

  1. Unixi aeg on sekundite arv alates 1. jaanuarist 1970 00:00:00 UTC.
  2. Kui ootate täpselt ühe sekundi, muutub Unixi aeg täpselt ühe sekundi võrra.
  3. Unixi aeg ei liigu kunagi tagasi.

Ükski sellest pole tõsi.

Kuid sellest ei piisa, kui ütlete lihtsalt: "Mitte ükski neist pole tõsi", ilma selgitamata. miks. Vt selgitusi allpool. Aga kui tahad ise mõelda, siis ära keri kellapildist mööda!

Programmeerijate väärarusaamad Unixi aja kohta
Lauakell 1770. aastatest. Koostanud John Leroux. Alates Tere tulemast kollektsioonid. Avaldatud litsentsi alusel CC BY

Kõigil kolmel eksiarvamusel on üks põhjus: hüpesekundeid. Kui te pole liiga sekunditega tuttav, siis siin on kiire viide:

UTC aja määravad kaks tegurit:

  • Rahvusvaheline aatomiaeg: Sadade aatomkellade keskmised näidud üle maailma. Teist saame mõõta aatomi elektromagnetiliste omadustega ja see on teadusele teadaolevalt kõige täpsem ajamõõtmine.
  • Maailmaaeg, mis põhineb Maa pöörlemisel ümber oma telje. Üks täispööre on üks päev.

Probleem on selles, et need kaks numbrit ei kattu alati. Maa pöörlemine ei ole järjepidev – see aeglustub järk-järgult, mistõttu päevad universaalajas muutuvad pikemaks. Teisest küljest on aatomkellad kuratlikult täpsed ja püsivad miljonite aastate jooksul.

Kui kaks korda jäävad sünkroonimisest välja, lisatakse või eemaldatakse UTC-st teine, et need uuesti sünkroonida. Teenistus aastast 1972 IERS (mis seda juhtumit käivitab) lisas 27 lisasekundit. Tulemuseks oli 27 UTC päeva kestusega 86 401 sekundit. Teoreetiliselt on võimalik päev, mille kestus on 86 399 sekundit (miinus üks). Mõlemad valikud on vastuolus Unixi aja põhimõttelise eeldusega.

Unixi aeg eeldab, et iga päev kestab täpselt 86 400 sekundit (60 × 60 × 24 = 86 400), ilma täiendavate sekunditeta. Kui selline hüpe toimub, siis Unixi aeg kas hüppab ühe sekundi või loeb kaks sekundit ühes. 2019. aasta seisuga on sellel puudu 27 hüpesekundit.

Seega tuleb meie väärarusaamu täiendada järgmiselt:

  • Unixi aeg on sekundite arv alates 1. jaanuarist 1970 00:00:00 UTC miinus hüpesekundid.
  • Kui ootate täpselt ühe sekundi, muutub Unixi aeg täpselt ühe sekundi võrra, välja arvatud juhul, kui hüpesekund on eemaldatud.

    Siiani pole sekundeid praktikas kunagi eemaldatud (ja Maa pöörlemise aeglustumine tähendab, et see on ebatõenäoline), kuid kui see kunagi juhtuks, tähendaks see, et UTC päev muutuks sekundi võrra lühemaks. Sel juhul jäetakse UTC viimane sekund (23:59:59) kõrvale.

    Igal Unixi päeval on sama arv sekundeid, nii et lühendatud päeva viimane Unixi sekund ei vasta ühelegi UTC ajale. Veerandsekundiliste intervallidega näeb see välja järgmine:

    Programmeerijate väärarusaamad Unixi aja kohta

    Kui alustate kell 23:59:58:00 UTC ja ootate ühe sekundi, liigub Unixi aeg kaks UTC sekundit edasi ja Unix 101 ajatemplit ei määrata kellelegi.

  • Unixi aeg ei saa kunagi tagasi minna, kuni lisatakse hüpesekund.

    Praktikas on seda juhtunud juba 27 korda. UTC päeva lõpuks lisatakse sekund kell 23:59:60. Unixil on päevas sama arv sekundeid, seega ei saa ta sekundit juurde lisada – selle asemel peab ta viimase sekundi jooksul kordama Unixi ajatempleid. Veerandsekundiliste intervallidega näeb see välja järgmine:

    Programmeerijate väärarusaamad Unixi aja kohta

    Kui alustate kell 23:59:60.50 ja ootate pool sekundit, on Unixi aeg tuleb tagasi poole sekundi võrra ja Unix 101 ajatempel vastab kahele UTC sekundile.

Need pole ilmselt ainsad Unixi aegade veidrused – just see, mis mulle eile meenus.

Aeg - väga kummaline asi.

Allikas: www.habr.com

Lisa kommentaar