včera Danny Pýtal som sa na pár zaujímavých faktov o Unixovom čase a spomenul som si, že niekedy to funguje úplne neintuitívne.
Tieto tri fakty sa zdajú byť mimoriadne rozumné a logické, však?
Unixový čas je počet sekúnd od 1. januára 1970 00:00:00 UTC.
Ak počkáte presne jednu sekundu, čas Unixu sa zmení presne o jednu sekundu.
Unixový čas sa nikdy neposúva dozadu.
Nič z toho nie je pravda.
Nestačí však jednoducho povedať: „Nič z toho nie je pravda,“ bez vysvetlenia. prečo. Vysvetlenia nájdete nižšie. Ale ak chcete myslieť sami, neskrolujte za obrázok hodín!
Stolové hodiny zo 1770. rokov XNUMX. storočia. Zostavil John Leroux. Od Uvítacie kolekcie. Publikované v licencii CC BY
Všetky tri mylné predstavy majú jeden dôvod: prestupné sekundy. Ak nepoznáte prestupné sekundy, tu je rýchly odkaz:
Čas UTC je určený dvoma faktormi:
Medzinárodný atómový čas: Priemerné hodnoty zo stoviek atómových hodín po celom svete. Druhý môžeme merať elektromagnetickými vlastnosťami atómu, a to je najpresnejšie meranie času, aké veda pozná.
svetový čas, založený na rotácii Zeme okolo vlastnej osi. Jedna úplná revolúcia je jeden deň.
Problém je, že tieto dve čísla sa nie vždy zhodujú. Rotácia Zeme nie je konzistentná – postupne sa spomaľuje, takže dni svetového času sa predlžujú. Na druhej strane, atómové hodiny sú čertovsky presné a konštantné po milióny rokov.
Keď dva časy vypadnú zo synchronizácie, sekunda sa pridá alebo odstráni z UTC, aby sa znova zosynchronizovali. Služba od roku 1972 IERS (v tomto prípade) pridal 27 sekúnd navyše. Výsledkom bolo 27 dní UTC s trvaním 86 401 sekúnd. Teoreticky je možný deň s trvaním 86 399 sekúnd (mínus jedna). Obe možnosti sú v rozpore so základným predpokladom unixového času.
Unixový čas predpokladá, že každý deň trvá presne 86 400 sekúnd (60 × 60 × 24 = 86 400) bez akýchkoľvek ďalších sekúnd. Ak k takémuto skoku dôjde, potom Unixový čas buď poskočí o jednu sekundu, alebo počíta dve sekundy za jednu. Od roku 2019 mu chýba 27 prestupných sekúnd.
Takže naše mylné predstavy treba doplniť takto:
Unixový čas je počet sekúnd od 1. januára 1970 00:00:00 UTC mínus prestupné sekundy.
Ak počkáte presne jednu sekundu, čas Unixu sa zmení presne o jednu sekundu, pokiaľ nebola odstránená prestupná sekunda.
Až doteraz sa sekundy v praxi nikdy neodstránili (a spomalenie rotácie Zeme znamená, že je to nepravdepodobné), ale ak by sa to niekedy stalo, znamenalo by to, že deň UTC by sa skrátil o jednu sekundu. V tomto prípade sa zahodí posledná sekunda UTC (23:59:59).
Každý Unixový deň má rovnaký počet sekúnd, takže posledná Unixová sekunda skráteného dňa nebude zodpovedať žiadnemu času UTC. Takto to vyzerá v štvrťsekundových intervaloch:
Ak začnete o 23:59:58:00 UTC a počkáte jednu sekundu, čas Unixu sa posunie o dve sekundy UTC a časová pečiatka Unix 101 nebude pridelená nikomu.
Unixový čas sa nikdy nedá vrátiť späť, kým sa nepridá skoková sekunda.
V praxi sa tak stalo už 27-krát. Na konci dňa UTC sa pridá ďalšia sekunda o 23:59:60. Unix má rovnaký počet sekúnd za deň, takže nemôže pridať ďalšiu sekundu - namiesto toho musí opakovať časové značky Unixu na poslednú sekundu. Takto to vyzerá v štvrťsekundových intervaloch:
Ak začnete o 23:59:60.50 a počkáte pol sekundy, čas Unix vracia sa o pol sekundy a časová značka Unix 101 zodpovedá dvom sekundám UTC.
Toto pravdepodobne nie sú jediné zvláštnosti z čias Unixu - len to, čo som si spomenul včera.