Mylné představy programátorů o době Unixu

omlouvám se Patrick McKenzie.

Včera Danny Ptal jsem se na některá zajímavá fakta o unixovém čase a vzpomněl jsem si, že někdy to funguje zcela neintuitivně.

Tyto tři skutečnosti se zdají mimořádně rozumné a logické, že?

  1. Unixový čas je počet sekund od 1. ledna 1970 00:00:00 UTC.
  2. Pokud počkáte přesně jednu sekundu, čas Unixu se změní přesně o jednu sekundu.
  3. Unixový čas se nikdy neposune zpět.

Nic z toho není pravda.

Nestačí však jednoduše říci: „Nic z toho není pravda,“ bez vysvětlení. proč. Vysvětlení viz níže. Ale pokud chcete myslet sami, nepřesouvejte se za obrázek hodin!

Mylné představy programátorů o době Unixu
Stolní hodiny ze 1770. let XNUMX. století. Sestavil John Leroux. Z Vítejte sbírky. Publikováno v licenci CC BY

Všechny tři mylné představy mají jeden důvod: přestupné sekundy. Pokud neznáte přestupné sekundy, zde je rychlý odkaz:

Čas UTC je určen dvěma faktory:

  • Mezinárodní atomový čas: Průměrné hodnoty ze stovek atomových hodin po celém světě. Sekundu můžeme měřit elektromagnetickými vlastnostmi atomu, a to je nejpřesnější měření času, které věda zná.
  • Světový čas, založené na rotaci Země kolem vlastní osy. Jedna úplná revoluce je jeden den.

Problém je, že tato dvě čísla se ne vždy shodují. Rotace Země není konzistentní – postupně se zpomaluje, takže dny ve světovém čase se prodlužují. Na druhou stranu jsou atomové hodiny ďábelsky přesné a konstantní po miliony let.

Když se dva časy nesynchronizují, přidá se nebo odebere sekunda z UTC, aby se znovu synchronizovaly. Od roku 1972 servis IERS (který běží v tomto případě) přidal 27 sekund navíc. Výsledkem bylo 27 dní UTC s délkou trvání 86 401 sekund. Teoreticky je možný den o délce 86 399 sekund (mínus jedna). Obě možnosti jsou v rozporu se základním předpokladem unixového času.

Unixový čas předpokládá, že každý den trvá přesně 86 400 sekund (60 × 60 × 24 = 86 400), bez dalších sekund. Pokud k takovému skoku dojde, pak Unixový čas buď poskočí o jednu sekundu, nebo počítá dvě sekundy v jedné. Od roku 2019 chybí 27 přestupných sekund.

Naše mylné představy je tedy třeba doplnit takto:

  • Unixový čas je počet sekund od 1. ledna 1970 00:00:00 UTC mínus přestupné sekundy.
  • Pokud počkáte přesně jednu sekundu, čas Unixu se změní přesně o jednu sekundu, pokud nebyla odstraněna přestupná sekunda.

    Až dosud nebyly sekundy v praxi nikdy odstraněny (a zpomalení rotace Země znamená, že je to nepravděpodobné), ale pokud by k tomu někdy došlo, znamenalo by to, že den UTC by se zkrátil o jednu sekundu. V tomto případě je vyřazena poslední sekunda UTC (23:59:59).

    Každý unixový den má stejný počet sekund, takže poslední unixová sekunda zkráceného dne nebude odpovídat žádnému času UTC. Takto to vypadá ve čtvrtsekundových intervalech:

    Mylné představy programátorů o době Unixu

    Pokud začnete ve 23:59:58:00 UTC a počkáte jednu sekundu, čas Unixu se posune o dvě sekundy UTC a časové razítko Unix 101 nebude přiděleno nikomu.

  • Unixový čas se nikdy nemůže vrátit, dokud se nepřidá přestupná sekunda.

    To se v praxi stalo již 27krát. Na konci dne UTC se přidá další sekunda ve 23:59:60. Unix má stejný počet sekund za den, takže nemůže přidat další sekundu - místo toho musí opakovat časová razítka Unixu na poslední sekundu. Takto to vypadá ve čtvrtsekundových intervalech:

    Mylné představy programátorů o době Unixu

    Pokud začnete ve 23:59:60.50 a počkáte půl sekundy, čas Unixu vrací se o půl sekundy a časové razítko Unixu 101 odpovídá dvěma sekundám UTC.

Pravděpodobně to nejsou jediné zvláštnosti doby Unixu - jen to, na co jsem si vzpomněl včera.

Čas - velmi divná věc.

Zdroj: www.habr.com

Přidat komentář