Programuotojų klaidingos nuomonės apie Unix laiką

aš atsiprašau Patrikas McKenzie.

Vakar Danny Paklausiau įdomių faktų apie Unix laiką ir prisiminiau, kad kartais jis veikia visiškai neintuityviai.

Šie trys faktai atrodo labai pagrįsti ir logiški, ar ne?

  1. Unix laikas yra sekundžių skaičius nuo 1 m. sausio 1970 d. 00:00:00 UTC.
  2. Jei lauksite lygiai vieną sekundę, Unix laikas pasikeis lygiai viena sekunde.
  3. Unix laikas niekada nejuda atgal.

Niekas iš to nėra tiesa.

Tačiau neužtenka tiesiog pasakyti: „Niekas iš to nėra tiesa“, nepaaiškinus. kodėl. Paaiškinimus žr. toliau. Bet jei norite pagalvoti patys, neslinkite pro laikrodžio paveikslėlį!

Programuotojų klaidingos nuomonės apie Unix laiką
1770 m. stalo laikrodis. Sudarė John Leroux. Iš Sveikos kolekcijos. Paskelbta pagal licenciją CC BY

Visos trys klaidingos nuomonės turi vieną priežastį: šuolio sekundės. Jei nesate susipažinę su keliamomis sekundėmis, čia yra trumpa nuoroda:

UTC laiką lemia du veiksniai:

  • Tarptautinis atominis laikas: Vidutiniai šimtų atominių laikrodžių rodmenys visame pasaulyje. Antrąjį galime išmatuoti pagal atomo elektromagnetines savybes, ir tai yra tiksliausias mokslui žinomas laiko matavimas.
  • Pasaulio laikas, remiantis Žemės sukimu aplink savo ašį. Viena pilna revoliucija yra viena diena.

Problema ta, kad šie du skaičiai ne visada sutampa. Žemės sukimasis nėra nuoseklus – jis palaipsniui lėtėja, todėl dienos Pasauliniu laiku ilgėja. Kita vertus, atominiai laikrodžiai yra velniškai tikslūs ir pastovūs milijonus metų.

Kai du laikai nesinchronizuojami, antrasis pridedamas arba pašalinamas iš UTC, kad jie vėl būtų sinchronizuojami. Nuo 1972 m IERS (kuris veikia šioje byloje) pridėjo 27 papildomas sekundes. Rezultatas buvo 27 UTC dienos, kurių trukmė buvo 86 401 sekundė. Teoriškai galima diena, kurios trukmė 86 399 sekundės (minus viena). Abi parinktys prieštarauja pagrindinei Unix laiko prielaidai.

Unix laikas daro prielaidą, kad kiekviena diena trunka tiksliai 86 400 sekundžių (60 × 60 × 24 = 86 400), be jokių papildomų sekundžių. Jei toks šuolis įvyksta, Unix laikas arba peršoka vieną sekundę, arba skaičiuoja dvi sekundes per vieną. 2019 m. trūksta 27 šuolio sekundžių.

Taigi mūsų klaidingas nuomones reikia papildyti taip:

  • Unix laikas yra sekundžių skaičius nuo 1 m. sausio 1970 d. 00:00:00 UTC minus keliamosios sekundės.
  • Jei palauksite lygiai vieną sekundę, Unix laikas pasikeis lygiai viena sekunde, nebent buvo pašalinta keliamoji sekundė.

    Iki šiol praktikoje sekundės niekada nebuvo pašalintos (o Žemės sukimosi sulėtėjimas reiškia, kad tai mažai tikėtina), tačiau jei taip nutiktų, tai reikštų, kad UTC diena sutrumpėtų viena sekunde. Tokiu atveju paskutinė UTC sekundė (23:59:59) atmetama.

    Kiekviena Unix diena turi tiek pat sekundžių, todėl paskutinė sutrumpintos dienos Unix sekundė neatitiks jokio UTC laiko. Štai kaip tai atrodo ketvirčio sekundės intervalais:

    Programuotojų klaidingos nuomonės apie Unix laiką

    Jei pradėsite 23:59:58:00 UTC ir palauksite vieną sekundę, Unix laikas pastums dvi UTC sekundes ir Unix 101 laiko žyma niekam nebus priskirta.

  • Unix laikas niekada negali grįžti atgal, kol pridedama šoktelė sekundė.

    Praktikoje tai jau nutiko 27 kartus. Pasibaigus UTC dienai, 23:59:60 pridedama papildoma sekundė. „Unix“ turi tiek pat sekundžių per dieną, todėl ji negali pridėti papildomos sekundės – vietoj to ji turi pakartoti „Unix“ laiko žymas paskutinę sekundę. Štai kaip tai atrodo ketvirčio sekundės intervalais:

    Programuotojų klaidingos nuomonės apie Unix laiką

    Jei pradėsite 23:59:60.50 ir palauksite pusę sekundės, Unix laikas grįžta atgal puse sekundės, o Unix 101 laiko žyma atitinka dvi UTC sekundes.

Tai turbūt ne vienintelės Unix laikų keistenybės – tik tai, ką prisiminiau vakar.

Laikas - labai keistas dalykas.

Šaltinis: www.habr.com

Добавить комментарий