Tools Blog

Co je čas epochy Unixu? Vývojářský průvodce časovými razítky

Unix Epoch Timestamp Explained

Pokud jste někdy dotazovali databázi nebo pracovali s moderním rozhraním API, pravděpodobně jste viděli, že se data nevrátila jako „12. října 2026“, ale jako masivní, zastrašující řetězec čísel jako 1791800000. Toto je Unixové časové razítko a je univerzální páteří měření času v počítačové vědě.

Zacházení s daty a časy v programování je notoricky obtížné. Časová pásma se mění, letní čas začíná a končí nepředvídatelně a přestupné roky přinášejí dny navíc. Aby vyřešili tuto chaotickou realitu, rozhodli se inženýři, kteří postavili operační systém Unix, vymyslet vlastní absolutní časovou osu.

🎥 Vzdělávací video: Problém Y2K38 a doba epochy (Zástupný symbol pro vložený koncepční výukový program YouTube)

Původ: 1. ledna 1970

Unixové časové razítko je jednoduše počet sekund, které uplynuly od 1. ledna 1970 v 00:00:00 UTC. Tento přesný okamžik v historii je známý jako „Epocha Unixu“.

Proč 1970? Protože na začátku 70. let bylo skladování neuvěřitelně drahé. Uložení data jako lidsky čitelného řetězce jako „1970-01-01 00:00:00“ zabere téměř 20 bajtů paměti. Uložení jako jediné 32bitové celé číslo trvalo pouze 4 bajty. Tím, že výchozí bod vytvořili blízko doby, kdy byl vynalezen Unix, maximalizovali množství budoucího času, který by mohli uložit do těchto 4 bajtů.

Proč vývojáři milují časová razítka Unixu

Hlavním důvodem, proč je unixový čas všeobecně přijímán napříč API, databázemi a mikroslužbami, je to, že nemá žádné časové pásmo. Globálně představuje jediný absolutní okamžik v čase.

Pokud uložíte událost do databáze pomocí místního času serveru ("03:00 PM EST") a později migrujete svůj server do Londýna, veškerá vaše matematika se přeruší. Pokud však k události dojde v časovém razítku 1700000000, je toto číslo identické bez ohledu na to, zda je uživatel, který se na ni dotazuje, v Tokiu, New Yorku nebo Paříži. Frontendová aplikace jednoduše vezme toto celé číslo a matematicky je převede na místní časové pásmo uživatele na jeho obrazovce.

Okamžitý převod časových razítek

Nesnažte se v duchu počítat vteřiny. Použijte náš offline nástroj k okamžitému překladu 10místného nebo 13místného časového razítka do lidsky čitelných dat ve vašem místním časovém pásmu.

Otevřete Převaděč časových razítek

Sekundy vs milisekundy (pravidlo 10 vs 13 číslic)

Jednou z nejčastějších chyb při vývoji webu je předání časového razítka funkci a získání data v roce 1970 nebo v roce 52 000. K tomu dochází kvůli záměně sekund a milisekund.

  • Standardní čas Unix (v sekundách): 10místné číslo (např. 1700000000). Toto je standard v Linuxu, PHP a většině backendových databází, jako je MySQL.
  • Čas JavaScriptu (milisekundy): 13místné číslo (např. 1700000000000). Funkce Date.now() JavaScriptu zahrnuje milisekundy pro vyšší přesnost.

Pokud do JavaScriptu vložíte 10místné časové razítko, aniž byste ho vynásobili 1000, JavaScript předpokládá, že mluvíte o prvních dnech ledna 1970.

// Correctly handling a Unix timestamp in JavaScript
const backendTimestamp = 1700000000;
const dateObject = new Date(backendTimestamp * 1000);

console.log(dateObject.toLocaleDateString()); // Converts to local user timezone

Problém roku 2038 (Y2K38)

Unixový čas má blížící se termín. Protože byl původně uložen jako 32bitové celé číslo se znaménkem, maximální počet, který může obsahovat, je 2 147 483 647.

19. ledna 2038, v 03:14:07 UTC, hodiny Unixu dosáhnou tohoto maximálního počtu. O sekundu později celé číslo přeteče a překlopí se na záporné číslo. Starší systémy, které nebyly upgradovány na 64bitovou architekturu, náhle uvěří, že se píše rok 1901, což způsobí katastrofální selhání softwaru po celém světě.

Naštěstí téměř veškerý moderní hardware, databáze a programovací jazyky (jako 64bitová linuxová jádra a moderní Node.js) již přešly na 64bitový čas, čímž se další přetečení posunulo o miliardy let do budoucnosti.

Často kladené otázky (FAQ)

Započítává čas Unixu přestupné sekundy?

Překvapivě ne. Unixový čas předpokládá, že každý den má přesně 86 400 sekund. Když svět přidá „přestupnou sekundu“, aby se přizpůsobil rotaci Země, unixové systémy obvykle opakují dvakrát stejné časové razítko, aby zůstaly synchronizované, aniž by došlo k porušení matematických výpočtů.

Může být časové razítko Unix záporné?

Ano. Každé časové razítko menší než 0 představuje datum před Unixovou epochou (1. ledna 1970). Například -86400 představuje přesně 31. prosince 1969.

Proč se moje převedené datum vždy zobrazuje jako 1970?

Pravděpodobně předáváte 10místné časové razítko do funkce, která očekává 13 číslic (milisekund). Před převodem své časové razítko vynásobte 1000.