Zablude programera o vremenu u Unixu

izvinjavam se Patrick McKenzie.

Juče Danny Pitao sam o nekim zanimljivim činjenicama o vremenu u Unixu, i sjetio sam se da ponekad funkcionira potpuno neintuitivno.

Ove tri činjenice izgledaju krajnje razumne i logične, zar ne?

  1. Unix vrijeme je broj sekundi od 1. januara 1970. 00:00:00 UTC.
  2. Ako sačekate tačno jednu sekundu, Unix vreme će se promeniti za tačno jednu sekundu.
  3. Unix vrijeme se nikada ne pomiče unazad.

Ništa od ovoga nije istina.

Ali nije dovoljno jednostavno reći: „Ništa od ovoga nije istina“, bez objašnjenja. zašto. Pogledajte dolje za objašnjenja. Ali ako želite da mislite svojom glavom, nemojte skrolovati pored slike sata!

Zablude programera o vremenu u Unixu
Stoni sat iz 1770-ih. Sastavio John Leroux. Od Welcome collections. Objavljeno pod licencom CC BY

Sve tri zablude imaju jedan razlog: preskočne sekunde. Ako niste upoznati s prijestupnim sekundama, evo kratke reference:

UTC vrijeme određuju dva faktora:

  • Međunarodno atomsko vrijeme: Prosečna očitavanja stotina atomskih satova širom sveta. Sekundu možemo mjeriti elektromagnetnim svojstvima atoma, a ovo je najpreciznije mjerenje vremena poznato nauci.
  • Svjetsko vrijeme, zasnovan na rotaciji Zemlje oko sopstvene ose. Jedna puna revolucija je jedan dan.

Problem je što se ova dva broja ne poklapaju uvijek. Zemljina rotacija nije konzistentna – postepeno se usporava, pa dani u univerzalnom vremenu postaju duži. S druge strane, atomski satovi su đavolski precizni i konstantni tokom miliona godina.

Kada dva puta ispadnu iz sinhronizacije, drugi se dodaje ili uklanja iz UTC-a kako bi se vratila u sinkronizaciju. Služba od 1972 IERS (koji pokreće ovaj slučaj) dodao je 27 dodatnih sekundi. Rezultat je bio 27 UTC dana sa trajanjem od 86 sekunde. Teoretski, dan u trajanju od 401 sekundi (minus jedan) je moguć. Obje opcije su u suprotnosti sa fundamentalnom pretpostavkom vremena Unixa.

Unix vrijeme pretpostavlja da svaki dan traje tačno 86 sekundi (400 × 60 × 60 = 24), bez dodatnih sekundi. Ako dođe do takvog skoka, tada Unix vrijeme ili skače za jednu sekundu, ili broji dvije sekunde u jednoj. Od 86. nedostaje mu 400 prestupnih sekundi.

Dakle, naše zablude treba dopuniti na sljedeći način:

  • Unix vrijeme je broj sekundi od 1. januara 1970. 00:00:00 UTC minus preskočne sekunde.
  • Ako čekate tačno jednu sekundu, Unix vrijeme će se promijeniti za tačno jednu sekundu, osim ako prestupna sekunda nije uklonjena.

    Do sada se sekunde u praksi nikada nisu uklanjale (a usporavanje Zemljine rotacije znači da je to malo vjerovatno), ali ako bi se ikada dogodilo, to bi značilo da bi UTC dan postao za sekundu kraći. U ovom slučaju, posljednja sekunda UTC (23:59:59) se odbacuje.

    Svaki Unix dan ima isti broj sekundi, tako da posljednja Unix sekunda skraćenog dana neće odgovarati nijednom UTC vremenu. Evo kako to izgleda u intervalima od četvrtine sekunde:

    Zablude programera o vremenu u Unixu

    Ako počnete u 23:59:58:00 UTC i sačekate jednu sekundu, Unix vrijeme će unaprijediti dvije UTC sekunde i Unix 101 vremenska oznaka neće biti dodijeljena nikome.

  • Unix vrijeme se nikad ne može vratiti, dok se ne doda prestupna sekunda.

    To se u praksi već dogodilo 27 puta. Na kraju UTC dana dodaje se dodatna sekunda u 23:59:60. Unix ima isti broj sekundi u danu, tako da ne može dodati dodatnu sekundu - umjesto toga mora ponoviti Unix vremenske oznake za posljednju sekundu. Evo kako to izgleda u intervalima od četvrtine sekunde:

    Zablude programera o vremenu u Unixu

    Ako počnete u 23:59:60.50 i sačekate pola sekunde, Unix vrijeme vraća se za pola sekunde, a Unix 101 vremenska oznaka odgovara dvije UTC sekunde.

Ovo verovatno nisu jedine neobičnosti Unix vremena - samo ono čega sam se juče setio.

vrijeme - vrlo čudna stvar.

izvor: www.habr.com

Dodajte komentar