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?
Unixový čas je počet sekund od 1. ledna 1970 00:00:00 UTC.
Pokud počkáte přesně jednu sekundu, čas Unixu se změní přesně o jednu sekundu.
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!
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:
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:
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.