Unix Timestampy a Epoch Time: Problém roku 2038, vysvetlený

Publikované dňa: 9:00 AM , od Redakcia Cas-V.info

Vysvetlenie Unix timestampov: sekundy od epochy 1970, prevod na UTC, pretečenie roku 2038 o 03:14:07 UTC, 64-bitová oprava a prestupné sekundy.

Digitálne hodiny prechádzajúce z 03:14:07 UTC 19. januára 2038, ilustrujúce pretečenie signed 32-bitového Unix času

Čo je Unixový časový odtlačok?

Unixový časový odtlačok je jediné číslo: počet sekúnd, ktoré uplynuli od Unixovej epochy, definovanej ako 00:00:00 UTC 1. januára 1970. To je všetko. Žiadne časové pásmo, žiadny reťazec s dátumom, žiadne názvy mesiacov – len celé číslo, ktoré každú sekundu narastá o jednotku.

Keďže epocha je pevná a univerzálna, časový odtlačok ako 1700000000 znamená presne ten istý okamih kdekoľvek na Zemi. Server v Tokiu aj notebook v Chicagu sa zhodnú, že označuje 14. november 2023 o 22:13:20 UTC. Miestne zobrazenie sa líši podľa časového pásma, ale základné číslo sa nikdy nemení.

Jedno zámerné zjednodušenie: Unixový čas ignoruje priestupné sekundy. Predpokladá, že každý deň má presne 86 400 sekúnd, čo nie je úplne pravda z astronomického hľadiska, ale udržuje aritmetiku čistú. Viac o tom nižšie.

Prečo ich inžinieri milujú

Časové odtlačky sú všade v softvéri – časy modifikácie súborov, databázové záznamy, odpovede API, polia expirácie JWT, riadky logov – a to z dobrého dôvodu:

  • Sú jedinou hodnotou. Jedno celé číslo ukladá celý dátum a čas. Žiadne parsovanie, žiadna nejednoznačnosť typu MM/DD versus DD/MM.
  • Sú nezávislé od časového pásma. Číslo je vždy UTC. Na miestny čas prevádzate až vtedy, keď ho ukazujete človeku.
  • Dajú sa ľahko porovnávať a triediť. Ktorá udalosť bola skôr? Menšie celé číslo. Trvanie medzi dvoma udalosťami? Odčítajte ich; odpoveď je v sekundách.
  • Ukladajú sa kompaktne. Jediné 4- alebo 8-bajtové celé číslo oproti formátovanému reťazcu.

To je dôvod, prečo toľko infraštruktúry v zákulisí hovorí v epochových sekundách, aj keď rozhranie zobrazuje priateľský 2026-07-23. Ak sa chcete pohybovať medzi týmito dvoma reprezentáciami, konvertor Unix timestamp vykoná preklad v oboch smeroch.

Čítanie jedného: Praktický príklad

Vezmite časový odtlačok 1000000000 – slávny, pretože sa pretočil v priamom prenose medzi Unixovými nadšencami.

Ak ho chcete prečítať ručne, delíte sekundy na väčšie jednotky. Zhruba 1 000 000 000 sekúnd je približne 31,7 roka (rok má ~31 556 952 sekúnd). Pridajte to k epochovému roku 1970 a dostanete sa do 2001. Presný okamih je 9. september 2001, 01:46:40 UTC.

Túto aritmetiku robíte len zriedka manuálne – každý jazyk má vstavanú funkciu. V Pythone:

```python from datetime import datetime, timezone datetime.fromtimestamp(1000000000, tz=timezone.utc)

2001-09-09 01:46:40+00:00

```

Kľúčový bod: konverzia je vždy ukotvená k UTC. Funkcia premení surový počet sekúnd na kalendárny dátum tak, že sa posunie vpred od epochy. Ak chcete namiesto toho miestny čas, použijete posun časového pásma po konverzii na UTC – samotný časový odtlačok nenesie žiadne informácie o pásme.

Problém roku 2038

Tu sa príbeh stáva zaujímavým – a kde má veľa inak dobre navrhnutých systémov v sebe tikajúce hodiny.

Po desaťročia bol štandardný typ C používaný na uchovávanie Unixového času, time_t, bežne 32-bitové celé číslo so znamienkom. 32-bitové celé číslo so znamienkom môže reprezentovať hodnoty od −2 147 483 648 po 2 147 483 647. Táto horná hranica je problém.

Počítaním sekúnd od epochy 1970 sa hodnota 2 147 483 647 dosiahne 3. marca 14:07 UTC 19. januára 2038. O jednu sekundu neskôr by sa počítadlo malo stať 2 147 483 648 – ale toto číslo sa nezmestí do 32-bitového celého čísla so znamienkom. Namiesto pokračovania nahor bity pretečú a zavinú sa na najzápornejšiu hodnotu, −2 147 483 648.

Záporný časový odtlačok sa interpretuje ako čas pred epochou. Takže hodiny sa nielen zastavia – preskočia späť na 13. december 1901. Akýkoľvek systém, ktorý dôveroval svojmu 32-bitovému time_t, zrazu verí, že je začiatok dvadsiateho storočia.

Toto sa často nazýva Y2K38 bug alebo Unixový miléniový bug a štrukturálne je to rovnaký druh pretečenia pevnej šírky, ktorý spôsobil strach z roku 2000 – len ďalej v čase a zakorenený v limitoch binárnych celých čísel, nie v dvojciferných rokoch.

Kde to skutočne hryzie

Moderné 64-bitové desktopy a servery boli z veľkej časti opravené pred rokmi. Riziko sa sústreďuje na miesta, ktoré sa ťažko aktualizujú:

  • Vstavané a priemyselné systémy. Routery, ovládače, lekárske zariadenia, automobilové ECU a IoT hardvér, ktorý bol dodaný s 32-bitovým time_t a môže bežať nedotknutý 20+ rokov. Mnoho zariadení nasadených dnes bude stále v prevádzke v roku 2038.
  • Legacy C kód. Aplikácie skompilované so starou definíciou time_t, najmä tam, kde sa typ dostal do formátov na disku alebo sieťových protokolov.
  • Staré databázy a súborové systémy. Úložné formáty, ktoré zabalili časové odtlačky do 32-bitových polí. Niektoré staršie systémy už vykazujú príznaky pri práci s ďalekými budúcimi dátumami – pomyslite na 20-ročnú hypotéku alebo expiráciu certifikátu, ktorá siaha za rok 2038.

Spôsob zlyhania nie je vždy dramatický pád. Niekedy je to jemný nesprávne vypočítaný dátum: expirovaný token, ktorý sa číta ako platný, poradie triedenia, ktoré sa obráti, naplánovaná úloha, ktorá sa spustí v roku 1901.

Oprava: 64-bitový čas

Náprava je v princípe priamočiara – rozšíriť time_t na 64 bitov. 64-bitové celé číslo so znamienkom môže počítať sekundy ďaleko za akýkoľvek praktický horizont: bod pretečenia leží približne 292 miliárd rokov v budúcnosti, pohodlne za očakávanou životnosťou Slnka.

Väčšina súčasných operačných systémov už tento krok urobila. 64-bitový Linux používa 64-bitové time_t; dokonca aj 32-bitový Linux získal podporu 64-bitového času v jadre a glibc v posledných rokoch. Ťažká časť nie je samotná oprava – je to nájdenie a opätovné zostavenie každého posledného kusu firmvéru, každého uloženého formátu a každého binárneho súboru tretej strany, ktorý stále predpokladá 32 bitov. Táto auditná práca je skutočný projekt 2038.

Ako zapadajú priestupné sekundy

Astronomický čas a atómový čas sa mierne rozchádzajú, takže oficiálny UTC občas vloží priestupnú sekundu, aby udržal hodiny v súlade s rotáciou Zeme. Unixový čas, zámerne, predstiera, že neexistujú – pevne kóduje 86 400 sekúnd na deň.

Keď dôjde k priestupnej sekunde, systémy ju zvyčajne "rozmažú" – rozložia extra sekundu cez okno (Google popularizoval 24-hodinové rozmazanie), aby žiadne hodiny nikdy nemuseli ukazovať nemožné 23:59:60. Dôsledok: Unixové časové odtlačky zostávajú hladké a monotónne, za cenu toho, že sú počas rozmazania o nepatrný zlomok sekundy mimo prísneho UTC. Pre prakticky všetok softvér je to presne ten kompromis, ktorý chcete. Pretečenie v roku 2038 je problém šírky celého čísla; priestupné sekundy sú samostatná, oveľa menšia definičná zvláštnosť – nezamieňajte ich.

Kľúčové poznatky

  • Unixový časový odtlačok sú sekundy od 00:00:00 UTC 1. januára 1970, priestupné sekundy ignorované.
  • Je to jediné, na časovom pásme nezávislé celé číslo – ľahko sa ukladá, porovnáva a triedi.
  • Konverzia je vždy relatívna k UTC; miestny čas sa aplikuje dodatočne.
  • 32-bitové time_t so znamienkom pretečie o 03:14:07 UTC 19. januára 2038, zvinie sa na zápornú hodnotu a preskočí do roku 1901.
  • Oprava je 64-bitové time_t; úsilie spočíva v audite vstavaných a legacy systémov.

Chcete to vidieť v akcii? Vložte akúkoľvek epochovú hodnotu do konvertor Unix timestamp, aby ste ju prečítali ako ľudský dátum – alebo choďte opačným smerom a premeňte dátum na jeho časový odtlačok.

Často kladené otázky

Je Unixový časový odtlačok v sekundách alebo milisekundách?

Klasický Unixový čas je v sekundách. Avšak JavaScript a mnohé webové API používajú milisekundy od epochy, takže hodnota ako 1700000000000 je 1 000× väčšia. Rýchla pomôcka: časový odtlačok založený na sekundách pre nedávny dátum má 10 číslic; milisekundový má 13. V prípade pochybností skontrolujte veľkosť pred konverziou.

Spôsobí problém roku 2038 pád môjho telefónu alebo notebooku?

Takmer určite nie. Moderné 64-bitové operačné systémy už používajú 64-bitové time_t, čo posúva pretečenie o miliardy rokov. Skutočné riziko je v dlhotrvajúcich vstavaných zariadeniach a starom softvéri, ktorý stále spolieha na 32-bitový čas a nemusí byť aktualizovaný pred rokom 2038.

Môže byť Unixový časový odtlačok záporný?

Áno. Záporné hodnoty predstavujú okamihy pred epochou 1970 – napríklad -1 je 31. december 1969, 23:59:59 UTC. To je presne to, čo produkuje 32-bitové pretečenie v roku 2038, a preto sa zdá, že hodiny preskočia späť do roku 1901.

Prečo Unixový čas ignoruje priestupné sekundy?

Aby sa matematika udržala jednoduchá a predvídateľná. Zaobchádzanie s každým dňom ako s presne 86 400 sekundami znamená, že trvanie je len odčítanie a časové odtlačky zostávajú monotónne. Malý nesúlad s astronomickým UTC je riešený "rozmazaním" priestupnej sekundy, čo takmer všetky aplikácie uprednostňujú pred riešením okrajového prípadu 23:59:60.

Ako prevediem časový odtlačok bez písania kódu?

Použite online nástroj. konvertor Unix timestamp akceptuje epochovú hodnotu a okamžite zobrazí zodpovedajúci UTC a miestny dátum a čas a tiež prevádza kalendárne dátumy späť na časové odtlačky.

Čas teraz v tieto mestá:

Šanghaj · Peking · Dhaka · Káhira · Šen-čen · Guangzhou · Lagos · Kinšasa · Istanbul · Tokio · Čeng-du · Mumbai

Čas teraz v krajinách:

🇨🇳 Čína | 🇮🇳 India | 🇺🇸 Spojené štáty | 🇮🇩 Indonézia | 🇵🇰 Pákistán | 🇧🇷 Brazília | 🇳🇬 Nigéria | 🇧🇩 Bangladéš | 🇷🇺 Rusko | 🇯🇵 Japonsko |

Aktuálny čas v časové pásma:

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

Zdarma widgety pre webových správcov:

Bezplatný analogový widget na hodiny | Bezplatný digitálny hodinový widget | Bezplatný textový hodinový widget | Bezplatný slovný hodinový widget