Zablude programera o Unix vremenu

ispričavam se Patrick McKenzie.

Jučer Danny Pitao sam za neke zanimljive činjenice o vremenu Unixa, i sjetio sam se da ponekad radi potpuno neintuitivno.

Ove tri činjenice djeluju krajnje razumno i logično, zar ne?

  1. Unix vrijeme je broj sekundi od 1. siječnja 1970. 00:00:00 UTC.
  2. Ako čekate točno jednu sekundu, Unix vrijeme će se promijeniti za točno jednu sekundu.
  3. Unix vrijeme se nikada ne kreće unatrag.

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 misliti svojom glavom, nemojte skrolovati pored slike sata!

Zablude programera o Unix vremenu
Stolni sat iz 1770-ih. Sastavio John Leroux. Iz Kolekcije dobrodošlice. Objavljeno pod licencom CC BY

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

UTC vrijeme određuju dva faktora:

  • Međunarodno atomsko vrijeme: Prosječna očitanja stotina atomskih satova diljem svijeta. Drugu možemo mjeriti elektromagnetskim svojstvima atoma, a to je najpreciznije mjerenje vremena poznato znanosti.
  • Svjetsko vrijeme, koji se temelji na rotaciji Zemlje oko vlastite osi. Jedna puna revolucija je jedan dan.

Problem je što se ta dva broja ne podudaraju uvijek. Zemljina rotacija nije dosljedna – postupno se usporava, pa dani u univerzalnom vremenu postaju sve duži. S druge strane, atomski satovi su vraški točni i konstantni tijekom milijuna godina.

Kada dva vremena ispadnu sinkronizirana, sekunda se dodaje ili uklanja iz UTC-a kako bi se vratila u sinkronizaciju. Služba od 1972 IERS (koji vodi ovaj slučaj) je dodao 27 dodatnih sekundi. Rezultat je bio 27 UTC dana s trajanjem od 86 sekundi. Teoretski, moguć je dan u trajanju od 401 sekundi (minus jedan). Obje opcije proturječe temeljnoj pretpostavci Unix vremena.

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

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

  • Unix vrijeme je broj sekundi od 1. siječnja 1970. 00:00:00 UTC minus prijestupne sekunde.
  • Ako čekate točno jednu sekundu, Unix vrijeme će se promijeniti za točno jednu sekundu, osim ako je prijestupna sekunda uklonjena.

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

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

    Zablude programera o Unix vremenu

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

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

    To se u praksi dogodilo već 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 vremenske oznake Unixa za posljednju sekundu. Evo kako to izgleda, u intervalima od četvrt sekunde:

    Zablude programera o Unix vremenu

    Ako počnete u 23:59:60.50 i pričekate pola sekunde, Unix vrijeme vrati se za pola sekunde, a Unix 101 vremenska oznaka odgovara dvjema UTC sekundama.

Ovo vjerojatno nisu jedine neobičnosti Unix vremena - samo ono čega sam se jučer sjetio.

vrijeme - vrlo čudna stvar.

Izvor: www.habr.com

Dodajte komentar