Articol
Timestamps Unix și expresii cron explicate
Un timestamp Unix este doar un număr întreg. O expresie cron este doar cinci câmpuri. Ambele apar constant în munca de backend și ambele ridică probleme previzibile: una din cauza fusurilor orare, cealaltă din cauza unității.
Ce este un timestamp Unix
Un timestamp Unix numără numărul de secunde scurse de la 1970-01-01 00:00:00 UTC, un punct de referință cunoscut drept epoch Unix. Acea definiție are două consecințe importante. În primul rând, numărătoarea este în UTC: nu există niciun fus orar încorporat în număr în sine. 1718400000 înseamnă același moment oriunde pe Pământ, indiferent de unde se află mașina care îl stochează. În al doilea rând, epoch este definit în secunde, nu în altă unitate. O valoare cum ar fi 1718400000 reprezintă întotdeauna secunde de la miezul nopții 1 ianuarie 1970 UTC, cu excepția cazului în care un sistem sau protocol a făcut o altă alegere în mod explicit. Timestamps-urile sunt fără fus orar prin design, tocmai de aceea sunt utile pentru logare, baze de date și comunicarea inter-sisteme unde ceasurile din regiuni diferite trebuie să se refere la același moment în mod fără ambiguitate.

Secunde, milisecunde și problema anului 2038
Multe runtime-uri și API-uri moderne folosesc milisecunde în loc de secunde. Date.now() din JavaScript returnează milisecunde, deci 1718400000000 este același moment ca valoarea cu precizie de secundă 1718400000. Când primești un timestamp necunoscut, magnitudinea îți spune unitatea: un număr de 10 cifre este aproape întotdeauna secunde; un număr de 13 cifre este aproape întotdeauna milisecunde. Problema anului 2038 provine dintr-o altă alegere: stocarea unui timestamp cu precizie de secundă într-un număr întreg cu semn pe 32 de biți (32-bit). Valoarea maximă a unui număr întreg cu semn pe 32-bit este 2147483647, care corespunde la 2038-01-19 03:14:07 UTC. După acea secundă, contorul depășește la un număr negativ mare și data se întoarce la 1901 pe sistemele care nu gestionează limita. Remediul este utilizarea stocării pe 64 de biți. Cele mai multe sisteme de operare și baze de date actuale fac deja asta, dar sistemele incorporate, dispozitivele de rețea și formatele de fișiere vechi cu lățimea câmpului fixată acum decenii rămân la risc.
Conversia epoch la o dată lizibilă: pasul fusului orar
Conversia unei valori epoch la o dată lizibilă necesită doi pași: preia componentele datei UTC din numărul întreg, apoi aplică un decalaj UTC pentru a obține ora locală. Timestamp-ul în sine este UTC. Când întrebi ce dată reprezintă 1718325000, răspunsul corect este 2024-06-14 la 00:30 în UTC. La New York (UTC-4 vara), acea secundă cade pe 2024-06-13 la 20:30, seara precedentă: data se schimbă, nu doar ora. Acesta este pasul care produce rezultate greșite când este sărit: un dezvoltator loghează timestamp-ul brut în UTC, un instrument de raportare îl redă la ora locală fără conversie și data pare să fie decalată cu ore sau o zi întreagă. Instrumentul timestamp-converter de pe Sunasty gestionează explicit aceasta: introduci o valoare epoch, iar acesta arată data și ora UTC alături de data și ora locală proprii dispozitivului tău, astfel încât o traversare a graniței dintre zile ca aceasta să fie vizibilă dintr-o privire. Conversia rulează complet în browser și nimic din ce lipești nu este trimis nicăieri.

Sintaxa cron: cinci câmpuri, intervale, pași și liste
O expresie cron programează joburi recurente pe sisteme de tip Unix. Sintaxa standard are cinci câmpuri separate prin spații: minut (0-59), oră (0-23), zi-din-lună (1-31), lună (1-12), zi-din-săptămână (0-7, unde atât 0, cât și 7 reprezintă duminica). Un asterisc (*) într-un câmp înseamnă „fiecare valoare validă”. Expresia 30 8 * * 1-5 rulează la 08:30 de luni până vineri. Intervalele folosesc cratimă: 1-5 acoperă valorile 1, 2, 3, 4, 5. Listele folosesc virgule: 1,15 înseamnă prima și a 15-a. Pașii folosesc slash: */15 în câmpul minut înseamnă la fiecare 15 minute (0, 15, 30, 45). Acești combinatori pot apărea împreună: 0-30/10 înseamnă 0, 10, 20, 30. Un lucru pe care cron nu îl are este un câmp de fus orar. Daemonul citește ceasul mașinii pe care rulează, care este setat la fusul orar local al serverului. Dacă serverul rulează UTC, dar un dezvoltator se așteaptă la ora locală, programul se declanșează la ora de ceas greșită. Regula practică este să tratezi programele cron ca expresii la ora locală a serverului și să documentezi fusul orar al serverului alături de linia cron.
Utilizarea timestamp-converter local
Timestamp-converter-ul de pe Sunasty convertește în ambele direcții: epoch la dată lizibilă și dată lizibilă înapoi la epoch. Poți introduce o valoare cu precizie de secundă sau una cu precizie de milisecundă; instrumentul detectează unitatea din magnitudine. Afișează rezultatul în UTC și în fusul orar local al dispozitivului tău, unul lângă altul, alături de valorile brute în secunde și milisecunde gata de copiat. Un buton Now completează timestamp-ul curent dintr-un singur clic, o modalitate rapidă de a verifica ora Unix curentă fără a deschide un terminal. Nu există un selector separat de fus orar: coloana locală reflectă mereu fusul orar cu care este setat browserul tău în acel moment. Toate acestea rulează în browser. Valoarea pe care o lipești în câmp este citită de JavaScript pe partea clientului și nu părăsește niciodată dispozitivul.
Instrumente din acest articol
- Convertor de marcă temporalăConvertește mărci temporale Unix epoch în date umane (UTC + local) și înapoi. Detectează automat secunde vs milisecunde.
- Diferență între dateNumără zilele, săptămânile, lunile și anii dintre două date, complet în browser, nimic încărcat.
- Analizator expresii cronAnalizează o expresie cron și previzualizează următoarele rulări. Privat, în browser.
Întrebări frecvente
De ce folosește JavaScript milisecunde în loc de secunde?
Obiectul Date din JavaScript a fost proiectat să lucreze cu precizie sub-secundă de la început, iar milisecundele oferă de o mie de ori rezoluția secundelor fără a necesita un punct zecimal. Compromisul este că valorile sunt mai mari, motiv pentru care Date.now() produce un număr de 13 cifre, în timp ce majoritatea timestamps-urilor pe partea de server au 10 cifre.
Trebuie fiecare server care rulează cron să fie pe UTC?
Nu, dar rularea serverelor pe UTC este o practică frecventă tocmai pentru că elimină ambiguitatea. Când un server este pe UTC, o expresie cron precum 0 2 * * * înseamnă 02:00 UTC și acea oră este stabilă tot anul. Pe un server într-o zonă care observă ora de vară, același job se declanșează la un moment UTC diferit vara față de iarnă și poate rula de două ori sau sări o dată la limita schimbării ceasului.
Care este tipul de stocare sigur pentru timestamps după 2038?
Un număr întreg cu semn pe 64 de biți reține timestamps cu precizie de secundă până în anul 292277026596, care depășește cu mult orice preocupare practică. Cele mai multe baze de date actuale stochează timestamps ca valori pe 64 de biți în mod implicit. Dacă lucrezi cu o schemă moștenită sau un format de fișier binar care folosește câmpuri pe 32-bit, migrarea la stocarea pe 64 de biți înainte de limita 2038 este remediul corect.