Unixové časové značky a Čas epochy: Problém roku 2038, vysvětleno

Publikováno: 9:00 AM , od Redakce Cas-v.com

Unixové časové značky vysvětleny: sekundy od epochy 1970, převod UTC, přetečení roku 2038 v 03:14:07 UTC, 64bitová oprava a přestupné sekundy.

Digitální hodiny přecházející z 03:14:07 UTC 19. ledna 2038, ilustrující přetečení 32bitového Unixového času se znaménkem.

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/DD versus DD/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_t a 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_t se 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.

Čas nyní v tato města:

Šanghaj · Peking · Dháka · Káhira · Shenzhen · Guangzhou · Lagos · Kinshasa · Istanbul · Tokio · Čeng-ťiou · Mumbaj

Čas nyní v zemích:

🇨🇳 Čína | 🇮🇳 Indie | 🇺🇸 Spojené státy | 🇮🇩 Indonésie | 🇵🇰 Pákistán | 🇧🇷 Brazílie | 🇳🇬 Nigérie | 🇧🇩 Bangladéš | 🇷🇺 Rusko | 🇯🇵 Japonsko |

Měna časová pásma:

UTC | GMT | CET | PST | MST | CST | EST | EET | IST | Čína (CST) | JST | AEST | SAST | MSK | NZST |

Zdarma widgety pro webové mistry:

Zdarma analogový widget hodin | Zdarma digitální hodiny widget | Zdarma textové hodiny widget | Zdarma slovní hodiny widget