Co je Unixový časový otisk?
Unixový časový otisk je jediné číslo: počet sekund, které uplynuly od Unixové epochy, definované jako 00:00:00 UTC 1. ledna 1970. To je vše. Žádné časové pásmo, žádný řetězec s datem, žádné názvy měsíců – pouze celé číslo, které každou sekundu narůstá o jedničku.
Protože je epocha pevná a univerzální, časový otisk jako 1700000000 znamená přesně stejný okamžik kdekoli na Zemi. Server v Tokiu i notebook v Chicagu se shodnou, že odkazuje na 14. listopadu 2023 ve 22:13:20 UTC. Místní zobrazení se liší podle časového pásma, ale základní číslo se nikdy nemění.
Jedno záměrné zjednodušení: Unixový čas ignoruje přestupné sekundy. Předpokládá, že každý den má přesně 86 400 sekund, což není zcela pravda z hlediska astronomické reality, ale udržuje aritmetiku čistou. Více o tom níže.
Proč je inženýři milují
Časové otisky jsou všude v softwaru – časy modifikace souborů, databázové záznamy, API odpovědi, pole expirace JWT, logovací řádky – a to z dobrého důvodu:
- Jsou to jediná hodnota. Jedno celé číslo ukládá celé datum a čas. Žádné parsování, žádná nejednoznačnost ohledně
MM/DDversusDD/MM. - Jsou nezávislé na časovém pásmu. Číslo je vždy UTC. Na místní čas převádíte až tehdy, když ho ukazujete člověku.
- Lze je snadno porovnávat a řadit. Která událost nastala dříve? Menší celé číslo. Doba mezi dvěma událostmi? Odečtěte je; výsledek je v sekundách.
- Ukládají se kompaktně. Jediné 4- nebo 8-bajtové celé číslo oproti formátovanému řetězci.
To je důvod, proč tolik infrastruktury interně mluví v epoše sekund, i když rozhraní zobrazuje přátelské 2026-07-23. Pokud chcete přecházet mezi těmito dvěma reprezentacemi, Převodník Unix timestamp provádí překlad v obou směrech.
Čtení jednoho: Příklad
Vezměme časový otisk 1000000000 – slavný, protože se přetočil v přímém přenosu mezi Unixovými nadšenci.
Chcete-li jej přečíst ručně, rozdělíte sekundy na větší jednotky. Zhruba 1 000 000 000 sekund je asi 31,7 roku (rok má ~31 556 952 sekund). Přidejte to k epoše 1970 a dostanete se do 2001. Přesný okamžik je 9. září 2001, 01:46:40 UTC.
Tuto aritmetiku děláte jen zřídka ručně – každý jazyk má vestavěnou funkci. V Pythonu:
```python from datetime import datetime, timezone datetime.fromtimestamp(1000000000, tz=timezone.utc)
2001-09-09 01:46:40+00:00
```
Klíčový bod: převod je vždy ukotven k UTC. Funkce převádí hrubý počet sekund na kalendářní datum tím, že postupuje vpřed od epochy. Pokud chcete místní čas, použijete posun časového pásma po převodu na UTC – samotný časový otisk nenese žádnou informaci o pásmu.
Problém roku 2038
Zde se příběh stává zajímavým – a kde má mnoho jinak dobře navržených systémů tikající bombu uvnitř.
Po desetiletí byl standardní typ C používaný pro Unixový čas, time_t, běžně 32bitové celé číslo se znaménkem. 32bitové celé číslo se znaménkem může reprezentovat hodnoty od −2 147 483 648 do 2 147 483 647. Tento horní limit je problém.
Počítáme-li sekundy od epochy 1970, hodnota 2 147 483 647 je dosažena 19. ledna 2038 ve 03:14:07 UTC. O jednu sekundu později by měl čítač dosáhnout 2 147 483 648 – ale toto číslo se nevejde do 32bitového celého čísla se znaménkem. Místo aby pokračoval vzhůru, bity přetečou a přetočí se na nejzápornější hodnotu, −2 147 483 648.
Záporný časový otisk je interpretován jako čas před epochou. Hodiny se tedy nezastaví – skočí zpět na 13. prosince 1901. Jakýkoli systém, který důvěřoval svému 32bitovému time_t, najednou věří, že je počátek dvacátého století.
Toto se často nazývá Y2K38 bug nebo Unixový miléniový bug a strukturálně jde o stejný typ přetečení s pevnou šířkou, který způsobil paniku kolem roku 2000 – jen dále v budoucnosti a zakořeněný v limitech binárních celých čísel namísto dvouciferných let.
Kde to skutečně kouše
Moderní 64bitové stolní počítače a servery byly z velké části opraveny před lety. Riziko se soustředí na místech, která je obtížné aktualizovat:
- Vestavěné a průmyslové systémy. Routery, regulátory, zdravotnická zařízení, automobilové ECU a IoT hardware, který byl dodán s 32bitovým
time_ta může běžet nedotčený 20+ let. Mnoho zařízení nasazených dnes bude stále v provozu v roce 2038. - Legacy C kód. Aplikace zkompilované proti staré definici
time_t, zejména tam, kde se typ dostal do formátů na disku nebo síťových protokolů. - Staré databáze a souborové systémy. Úložné formáty, které zabalily časové otisky do 32bitových polí. Některé starší systémy již vykazují příznaky při práci s daty v daleké budoucnosti – pomyslete na 20letou hypotéku nebo expiraci certifikátu, která dosahuje za rok 2038.
Způsob selhání není vždy dramatický pád. Někdy je to jemná chyba ve vypočteném datu: vypršený token, který se jeví jako platný, pořadí řazení, které se obrátí, naplánovaná úloha, která se spustí v roce 1901.
Oprava: 64bitový čas
Náprava je v zásadě přímočará – rozšířit time_t na 64 bitů. 64bitové celé číslo se znaménkem může počítat sekundy daleko za jakýkoli praktický horizont: bod přetečení leží zhruba 292 miliard let v budoucnosti, pohodlně za očekávanou životností Slunce.
Většina současných operačních systémů již tento krok učinila. 64bitový Linux používá 64bitový time_t; dokonce i 32bitový Linux získal podporu 64bitového času v jádře a glibc v posledních letech. Těžká část není samotná oprava – je to najít a přestavět každý poslední kus firmwaru, každý uložený formát a každou binárku třetí strany, která stále předpokládá 32 bitů. Tato auditní práce je skutečný projekt 2038.
Jak zapadají přestupné sekundy
Astronomický čas a atomový čas se mírně rozcházejí, takže oficiální UTC občas vkládá přestupnou sekundu, aby udržela hodiny v souladu s rotací Země. Unixový čas, záměrně, předstírá, že neexistují – pevně kodifikuje 86 400 sekund na den.
Když nastane přestupná sekunda, systémy ji obvykle "rozmazávají" – rozprostřou extra sekundu přes okno (Google popularizoval 24hodinové rozmazání), aby žádné hodiny nikdy nemusely ukazovat nemožné 23:59:60. Důsledek: Unixové časové otisky zůstávají plynulé a monotónní, za cenu nepatrného zlomku sekundy odchylky od striktního UTC během rozmazání. Pro prakticky veškerý software je to přesně ten kompromis, který chcete. Přetečení v roce 2038 je problém šířky celého čísla; přestupné sekundy jsou samostatná, mnohem menší definiční zvláštnost – nepleťte si je.
Klíčové poznatky
- Unixový časový otisk je počet sekund od 00:00:00 UTC 1. ledna 1970, přestupné sekundy ignorovány.
- Je to jediné, na časovém pásmu nezávislé celé číslo – snadno se ukládá, porovnává a řadí.
- Převod je vždy relativní k UTC; místní čas se aplikuje až poté.
- 32bitový
time_tse znaménkem přetéká 19. ledna 2038 ve 03:14:07 UTC, přetočí se na zápornou hodnotu a skočí do roku 1901. - Oprava je 64bitový
time_t; úsilí spočívá v auditu vestavěných a legacy systémů.
Chcete to vidět v akci? Vložte libovolnou hodnotu epochy do Převodník Unix timestamp a přečtěte ji jako lidské datum – nebo jděte opačným směrem a převeďte datum na jeho časový otisk.
Často kladené otázky
Je Unixový časový otisk v sekundách nebo milisekundách?
Klasický Unixový čas je v sekundách. Nicméně JavaScript a mnoho webových API používá milisekundy od epochy, takže hodnota jako 1700000000000 je 1 000× větší. Rychlé vodítko: časový otisk založený na sekundách pro nedávné datum má 10 číslic; milisekundový má 13. V případě pochybností zkontrolujte velikost před převodem.
Způsobí problém roku 2038 pád mého telefonu nebo notebooku?
Téměř jistě ne. Moderní 64bitové operační systémy již používají 64bitový time_t, což posouvá přetečení o miliardy let dále. Skutečné riziko je v dlouho žijících vestavěných zařízeních a starém softwaru, který stále spoléhá na 32bitový čas a nemusí být před rokem 2038 aktualizován.
Může být Unixový časový otisk záporný?
Ano. Záporné hodnoty představují okamžiky před epochou 1970 – například -1 je 31. prosince 1969, 23:59:59 UTC. To je přesně to, co produkuje 32bitové přetečení v roce 2038, a proto hodiny zdánlivě skáčou zpět do roku 1901.
Proč Unixový čas ignoruje přestupné sekundy?
Aby byla matematika jednoduchá a předvídatelná. Považovat každý den za přesně 86 400 sekund znamená, že doby trvání jsou jen odečítání a časové otisky zůstávají monotónní. Malý nesoulad s astronomickým UTC je řešen "rozmazáním" přestupné sekundy, což téměř všechny aplikace preferují před řešením okrajového případu 23:59:60.
Jak převedu časový otisk bez psaní kódu?
Použijte online nástroj. Převodník Unix timestamp přijímá hodnotu epochy a okamžitě zobrazuje odpovídající UTC a místní datum a čas a také převádí kalendářní data zpět na časové otisky.