Timestamp-uri Unix fără dureri de cap
Întreabă trei dezvoltatori cât e ceasul și s-ar putea să primești trei răspunsuri diferite, în funcție de unde se află. Întreabă un timestamp Unix și primești exact un singur număr, identic pentru toată lumea de pe planetă. Acel număr întreg unic este motivul pentru care timpul epocă stă discret la baza aproape fiecărui fișier de jurnal, rând de bază de date și răspuns API pe care îl vei atinge vreodată. Această pagină explică ce înseamnă acel număr, cum se citește în ambele direcții și unde tinde să încurce lumea.

Ce este de fapt timpul Unix
Un timestamp Unix este numărul de secunde care au trecut de la ora 00:00:00 UTC din 1 ianuarie 1970, fără a număra secundele intercalare. Acel moment se numește epocă și a fost ales de primii ingineri Unix pur și simplu pentru că era o dată rotundă convenabilă de la care să numere. La epocă, valoarea este exact 0. Fiecare secundă de atunci adaugă o unitate, deci numărul doar crește. Datele dinainte de 1970 sunt și ele perfect valide, exprimate ca numere întregi negative.
Vei mai vedea acest concept numit și timp POSIX sau, mai vag, timp epocă. Indiferent de etichetă, mecanica este aceeași: un contor mereu crescător de secunde. Pentru că este un simplu număr întreg, nu un string formatat, un calculator îl poate stoca în câțiva bytes și poate compara două astfel de valori cu o singură scădere.
Secunde, milisecunde și rude apropiate
Timpul Unix clasic numără secunde întregi, ceea ce dă familiarul număr de zece cifre pe care îl vezi astăzi. Dar multe medii au nevoie de o rezoluție mai fină. JavaScript, de exemplu, lucrează în milisecunde, producând o valoare de treisprezece cifre, iar unele sisteme merg și mai departe, în microsecunde sau nanosecunde. O regulă de bază de încredere: un număr de zece cifre este exprimat în secunde, treisprezece cifre înseamnă milisecunde. Dacă data ta convertită ajunge undeva prin 1970, deși te așteptai la ziua de azi, aproape sigur ai introdus milisecunde într-un câmp de secunde, sau invers. Convertorul nostru detectează automat ordinul de mărime, așa că rareori trebuie să ghicești.
De ce se bazează dezvoltatorii pe el
Marele avantaj este că un timestamp este neutru din punct de vedere al fusului orar. Numărul întreg 1735689600 se referă la același moment în Tokyo, Berlin și São Paulo. Stocarea acelui număr, în loc de un string formatat local, înseamnă că nu trebuie niciodată să te întrebi cărui ceas îi aparținea o valoare. Sortarea este și ea trivială, pentru că ordinea cronologică este pur și simplu ordine numerică, deci un index de bază de date pe o coloană de timestamp sortează evenimentele corect, fără nicio analiză. Aritmetica este la fel de curată: intervalul dintre două evenimente este o singură scădere, iar adăugarea unei zile înseamnă adăugarea a 86400. Aceste proprietăți sunt exact motivul pentru care jurnalele, token-urile, cache-urile și cozile de mesaje apelează toate la timpul epocă.
Conversia în ambele direcții
A merge de la un timestamp la o dată lizibilă pentru oameni înseamnă a lua numărul de secunde și a-l proiecta pe un calendar, apoi a formata acel rezultat în orice fus orar te interesează. Mergând invers, iei un an, o lună, o zi și o oră, decizi în ce fus orar este exprimată acea dată, apoi o comprimi înapoi în secunde de la epocă. Instrumentul nostru face ambele direcții instant, integral în browserul tău, astfel încât nimic din ce lipești nu părăsește aparatul. Lipește un număr pentru a-l decodifica, sau alege o dată pentru a o codifica, și citește rezultatul atât în UTC, cât și în ora ta locală, în același moment.

UTC versus ora locală, capcana clasică
Timestamp-ul în sine nu are fus orar; este întotdeauna ancorat la UTC. Confuzia apare doar atunci când îl afișezi. Dacă convertești 1700000000 și ecranul tău arată o oră de seară, în timp ce un coleg din altă țară vede o oră de după-amiază, nimic nu este stricat, doar vă uitați amândoi la același moment redat pe ceasuri locale diferite. Bug-urile apar când codul citește o dată locală de parcă ar fi UTC, sau înregistrează o oră de ceas de perete fără să salveze decalajul. Obiceiul sigur este să stochezi și să transmiți UTC și să aplici un decalaj local doar în ultimul moment, atunci când arăți valoarea unei persoane. Când ai dubii, compară cu linia UTC din convertor, nu cu cea locală.
Problema anului 2038
Multe sisteme mai vechi stocau timpul Unix într-un întreg semnat pe 32 de biți. Acel câmp rămâne fără spațiu la o secundă după ora 03:14:07 UTC din 19 ianuarie 2038, moment în care contorul depășește capacitatea și se întoarce la un număr negativ, aruncând potențial datele înapoi în 1901. Este din aceeași familie de probleme ca Y2K. Vestea bună este că sistemele de operare și limbajele moderne s-au mutat în mare parte la timestamp-uri pe 64 de biți, care nu vor depăși capacitatea timp de aproximativ 292 de miliarde de ani, deci pentru codul nou este mai degrabă o curiozitate istorică demnă de cunoscut decât o urgență.
Pentru mai multe ajutoare bazate pe browser, vezi instrumentele noastre pentru dezvoltatori, iar dacă trebuie să lucrezi cu numerele în sine, calculatoarele sunt la un click distanță.
Întrebări frecvente
Ce este un timestamp Unix?
Este numărul de secunde de la ora 00:00:00 UTC din 1 ianuarie 1970, fără a număra secundele intercalare. Acel moment de start se numește epocă, iar contorul doar crește în timp.
De ce numărul meu se convertește într-o dată din apropierea lui 1970?
Probabil ai confundat secundele cu milisecundele. Un număr de zece cifre este exprimat în secunde, iar unul de treisprezece cifre în milisecunde. Introducerea milisecundelor într-un câmp de secunde împarte timpul aparent la aproximativ o mie, aducându-te aproape de epocă.
Un timestamp Unix are un fus orar?
Nu. Valoarea este întotdeauna ancorată la UTC. Un fus orar intervine doar atunci când afișezi timestamp-ul ca dată lizibilă pentru oameni, motiv pentru care același număr poate arăta ore de ceas de perete diferite pentru persoane diferite.
Cum convertesc o dată înapoi într-un timestamp?
Oferă anul, luna, ziua și ora, decide în ce fus orar este exprimată acea dată, iar instrumentul o comprimă în secunde de la epocă. Poți face ambele direcții pe această pagină, instant, în browserul tău.
Ce este problema anului 2038?
Sistemele care stochează timpul Unix într-un întreg semnat pe 32 de biți depășesc capacitatea la o secundă după ora 03:14:07 UTC din 19 ianuarie 2038. Timestamp-urile moderne pe 64 de biți evită această problemă pentru miliarde de ani, deci majoritatea software-ului actual nu este afectat.
Datele mele sunt trimise către un server?
Nu. Conversia rulează integral în browserul tău, astfel încât orice timestamp sau dată pe care o lipești rămâne pe propriul dispozitiv.
