Žádné nahrávání, 100% lokálně, bez účtu

Článek

Unix timestamp a výrazy cron vysvětleny

Unix timestamp je jen celé číslo. Výraz cron je jen pět polí. Obojí se neustále objevuje v backendové práci a obojí lidi předvídatelně mate: jedno kvůli časovým pásmům, druhé kvůli jednotce.

Co je Unix timestamp

Unix timestamp počítá počet sekund, které uběhly od 1970-01-01 00:00:00 UTC, referenčního bodu známého jako Unix epoch. Tato definice má dvě důležité důsledky. Za prvé, počet je v UTC: v samotném čísle není vloženo žádné časové pásmo. 1718400000 znamená stejný okamžik kdekoli na Zemi bez ohledu na to, kde se nachází stroj, který ho ukládá. Za druhé, epoch je definována v sekundách, nikoli v jakékoli jiné jednotce. Hodnota jako 1718400000 jsou vždy sekundy od půlnoci 1. ledna 1970 UTC, pokud systém nebo protokol výslovně nezvolil jinak. Timestamp jsou záměrně bez časových pásem, což je přesně důvod, proč jsou užitečné pro protokolování, databáze a mezisystémovou komunikaci, kde hodiny v různých regionech musí odkazovat na stejný okamžik jednoznačně.

Časová osa zobrazující Unix epoch na 1970-01-01 00:00:00 UTC vlevo, aktuální timestamp uprostřed a hranici přetečení 2038 vpravo, označenou maximem znaménkového 32bitového celého čísla.

Sekundy, milisekundy a problém roku 2038

Mnoho moderních runtime prostředí a API používá milisekundy místo sekund. JavaScript Date.now() vrací milisekundy, takže 1718400000000 je stejný okamžik jako hodnota s přesností na sekundy 1718400000. Když obdržíte neznámý timestamp, velikost vám říká jednotku: 10ciferné číslo jsou téměř vždy sekundy; 13ciferné číslo jsou téměř vždy milisekundy. Problém roku 2038 pochází z jiné volby: ukládání timestampu s přesností na sekundy ve znaménkovém 32bitovém celém čísle. Maximální hodnota znaménkového 32bitového celého čísla je 2147483647, což odpovídá 2038-01-19 03:14:07 UTC. Po této sekundě se čítač přetočí na velké záporné číslo a datum se na systémech, které hranici nezvládají, vrátí zpět na rok 1901. Opravou je použití 64bitového úložiště. Většina současných operačních systémů a databází to již dělá, ale vestavěné systémy, síťová zařízení a staré formáty souborů, které zafixovaly šířku pole před desetiletími, zůstávají ohroženy.

Převod epoch na datum čitelné člověkem: krok s časovým pásmem

Převod hodnoty epoch na čitelné datum vyžaduje dva kroky: získání komponent data UTC z celého čísla a pak aplikování posunu UTC pro získání místního času. Samotný timestamp je UTC. Když se ptáte, jaké datum 1718325000 představuje, správnou odpovědí je 2024-06-14 v 00:30 UTC. V New Yorku (UTC-4 v létě) tato samá sekunda spadá na předchozí večer, 2024-06-13 ve 20:30: mění se datum, ne jen hodina. Toto je krok, který vynechán produkuje špatné výsledky: vývojář zaprotokoluji surový timestamp v UTC, reportovací nástroj ho vykreslí v místním čase bez převodu a datum se zdá být o hodiny nebo celý den posunuté. Nástroj timestamp-converter na Sunasty toto zpracovává explicitně: zadáte hodnotu epoch a nástroj zobrazí datum a čas v UTC vedle vlastního místního data a času vašeho zařízení, takže přechod přes hranici dne, jako je tento, je vidět na první pohled. Převod probíhá výhradně v prohlížeči a nic, co vložíte, není nikam odesláno.

Dvě mřížky kalendáře vedle sebe pro stejnou hodnotu epoch: mřížka UTC zvýrazňuje jeden kalendářní den a mřížka New Yorku (UTC-4) zvýrazňuje předchozí den, což ukazuje, jak se místní datum posouvá zpět kvůli časovému posunu.

Syntaxe cron: pět polí, rozsahy, kroky a seznamy

Výraz cron plánuje opakující se úlohy na systémech podobných Unixu. Standardní syntaxe má pět polí oddělených mezerami: minuta (0-59), hodina (0-23), den v měsíci (1-31), měsíc (1-12), den v týdnu (0-7, kde 0 i 7 reprezentují neděli). Hvězdička (*) v poli znamená „každá platná hodnota?. Výraz 30 8 * * 1-5 se spustí v 08:30 od pondělí do pátku. Rozsahy používají pomlčku: 1-5 pokrývá hodnoty 1, 2, 3, 4, 5. Seznamy používají čárky: 1,15 znamená 1. a 15. Kroky používají lomítko: */15 v poli minut znamená každých 15 minut (0, 15, 30, 45). Tyto kombinátory mohou být společně: 0-30/10 znamená 0, 10, 20, 30. Jedním, co cron nemá, je pole pro časové pásmo. Démon čte hodiny stroje, na kterém běží, které jsou nastaveny na místní časové pásmo serveru. Pokud server běží v UTC, ale vývojář očekává místní čas, plán se spustí ve špatnou hodinu. Praktickým pravidlem je zacházet s plány cron jako výrazy v místním čase serveru a dokumentovat časové pásmo serveru vedle řádku cron.

Použití timestamp-converter lokálně

Nástroj timestamp-converter na Sunasty převádí oběma směry: epoch na datum čitelné člověkem a datum čitelné člověkem zpět na epoch. Můžete zadat hodnotu s přesností na sekundy nebo s přesností na milisekundy; nástroj detekuje jednotku podle velikosti. Zobrazuje výsledek v UTC a ve vlastním místním časovém pásmu vašeho zařízení vedle sebe, spolu s hodnotami v surových sekundách a milisekundách připravenými ke zkopírování. Tlačítko Now vyplní aktuální timestamp jedním kliknutím, což je rychlý způsob, jak zjistit aktuální čas Unix bez otevírání terminálu. Samostatný výběr časového pásma neexistuje: sloupec s místním časem vždy odráží časové pásmo, na které je aktuálně nastavený váš prohlížeč. Vše toto běží v prohlížeči. Hodnota, kterou vložíte do pole, je čtena JavaScriptem na straně klienta a nikdy neopouští zařízení.

Nástroje v tomto článku

Časté dotazy

Proč JavaScript používá milisekundy místo sekund?

Objekt Date v JavaScriptu byl od začátku navržen pro práci s přesností menší než sekunda a milisekundy poskytují tisícinásobek rozlišení sekund bez nutnosti desetinné tečky. Kompromisem je, že hodnoty jsou větší, což je důvod, proč Date.now() produkuje 13ciferné číslo, zatímco většina timestampů na straně serveru má 10 číslic.

Musí každý server provozující cron být na UTC?

Ne, ale provoz serverů na UTC je běžnou praxí právě proto, že odstraňuje nejednoznačnost. Když je server na UTC, výraz cron jako 0 2 * * * znamená 02:00 UTC a tento čas je po celý rok stabilní. Na serveru v zóně, která dodržuje letní čas, se stejná úloha spustí v létě a v zimě v jiný okamžik UTC a může se dvakrát spustit nebo jednou přeskočit při přechodu hodin.

Jaký je bezpečný typ úložiště pro timestamp po roku 2038?

Znaménkové 64bitové celé číslo uchovává timestamp s přesností na sekundy až do roku 292277026596, což je daleko za jakoukoli praktickou starostí. Většina současných databází ukládá timestamp jako 64bitové hodnoty ve výchozím nastavení. Pokud pracujete se starším schématem nebo binárním formátem souboru, který používá 32bitová pole, migrace na 64bitové úložiště před hranicí 2038 je správnou opravou.