Ohjelmoijien väärinkäsitykset Unix-ajasta

Pahoittelen Patrick McKenzie.

Eilen Danny Kysyin mielenkiintoisia faktoja Unix-ajasta ja muistin, että joskus se toimii täysin epäintuitiivisesti.

Nämä kolme tosiasiaa vaikuttavat erittäin järkeviltä ja loogisilta, eikö niin?

  1. Unix-aika on sekuntien määrä 1. tammikuuta 1970 00:00:00 UTC alkaen.
  2. Jos odotat tasan sekunnin, Unix-aika muuttuu täsmälleen yhdellä sekunnilla.
  3. Unix-aika ei koskaan liiku taaksepäin.

Mikään näistä ei ole totta.

Mutta ei riitä, että sanot vain: "Mikään näistä ei ole totta" selittämättä. miksi. Katso selitykset alta. Mutta jos haluat ajatella itse, älä vieritä kellon kuvan ohi!

Ohjelmoijien väärinkäsitykset Unix-ajasta
Pöytäkello 1770-luvulta. Kokoanut John Leroux. From Tervetuloa kokoelmat. Julkaistu lisenssillä CC BY

Kaikilla kolmella väärinkäsityksellä on yksi syy: karkaussekunteja. Jos et ole perehtynyt karkaussekuntiin, tässä on pikaopas:

UTC-aika määräytyy kahdella tekijällä:

  • Kansainvälinen atomiaika: Keskimääräiset lukemat sadoista atomikelloista ympäri maailmaa. Voimme mitata toisen atomin sähkömagneettisilla ominaisuuksilla, ja tämä on tarkin tieteen tuntema ajan mittaus.
  • Maailman aika, joka perustuu Maan pyörimiseen oman akselinsa ympäri. Yksi täysi vallankumous on yksi päivä.

Ongelmana on, että nämä kaksi numeroa eivät aina täsmää. Maan pyöriminen ei ole johdonmukaista - se hidastuu vähitellen, joten maailmanajan päivät pidentyvät. Toisaalta atomikellot ovat pirun tarkkoja ja pysyviä miljoonien vuosien ajan.

Kun kaksi kertaa ei ole synkronoitu, toinen lisätään tai poistetaan UTC:stä, jotta ne saadaan takaisin synkronoituiksi. Vuodesta 1972 palvelua iers (joka suorittaa tämän tapauksen) lisäsi 27 ylimääräistä sekuntia. Tuloksena oli 27 UTC-päivää ja kesto 86 401 sekuntia. Teoriassa päivä, jonka kesto on 86 399 sekuntia (miinus yksi), on mahdollinen. Molemmat vaihtoehdot ovat ristiriidassa Unix-ajan perusoletuksen kanssa.

Unix-aika olettaa, että jokainen päivä kestää tasan 86 400 sekuntia (60 × 60 × 24 = 86 400) ilman ylimääräisiä sekunteja. Jos tällainen hyppy tapahtuu, Unix-aika joko hyppää yhden sekunnin tai laskee kaksi sekuntia yhdessä. Vuodesta 2019 lähtien siitä puuttuu 27 karkaussekuntia.

Joten väärinkäsityksiämme on täydennettävä seuraavasti:

  • Unix-aika on sekuntien määrä 1. tammikuuta 1970 00:00:00 UTC miinus karkaussekunteja.
  • Jos odotat tasan sekunnin, Unix-aika muuttuu täsmälleen yhdellä sekunnilla, ellei karkaussekuntia ole poistettu.

    Toistaiseksi sekunteja ei ole koskaan poistettu käytännössä (ja Maan pyörimisen hidastuminen tarkoittaa sitä, että tämä on epätodennäköistä), mutta jos se joskus tapahtuisi, se tarkoittaisi, että UTC-päivä lyhenisi sekuntia. Tässä tapauksessa UTC:n viimeinen sekunti (23:59:59) hylätään.

    Jokaisella Unix-päivällä on sama määrä sekunteja, joten lyhennetyn päivän viimeinen Unix-sekunti ei vastaa mitään UTC-aikaa. Tältä se näyttää neljännessekunnin välein:

    Ohjelmoijien väärinkäsitykset Unix-ajasta

    Jos aloitat klo 23:59:58:00 UTC ja odotat yhden sekunnin, Unix-aika siirtyy kaksi UTC-sekuntia eteenpäin ja Unix 101 -aikaleimaa ei anneta kenellekään.

  • Unix-aika ei voi koskaan palata takaisin, kunnes lisätään karkaussekunti.

    Tämä on tapahtunut käytännössä jo 27 kertaa. UTC-päivän lopussa lisätään ylimääräinen sekunti klo 23:59:60. Unixilla on sama määrä sekunteja päivässä, joten se ei voi lisätä ylimääräistä sekuntia - sen sijaan sen on toistettava Unix-aikaleimat viimeisen sekunnin ajan. Tältä se näyttää neljännessekunnin välein:

    Ohjelmoijien väärinkäsitykset Unix-ajasta

    Jos aloitat klo 23:59:60.50 ja odotat puoli sekuntia, Unix-aika tulee takaisin puoli sekuntia, ja Unix 101 -aikaleima vastaa kahta UTC sekuntia.

Nämä eivät luultavasti ole ainoita Unix-aikojen omituisuuksia - vain mitä muistin eilen.

Aika - hyvin outo asia.

Lähde: will.com

Lisää kommentti