De ce Unix are propriul concept de timp? Care este epoca și care este problema Y2038?
Ora Unix este un mijloc de a reprezenta o anumită dată și oră, utilizat de Linux, macOS și multe alte sisteme interoperabile. Este atât de răspândit, încât probabil îl folosiți fără să știți. Odată ce înțelegeți ora Unix, o veți observa în multe contexte. Mai multe instrumente vă pot ajuta să lucrați cu timpul Unix.
Care este scopul timpului Unix?
Timpul Unix este un număr total de secunde de la o oră și o dată fixă. Este un format de dată/oră (sau marca temporală) care arată diferit de datele și orele care pot fi citite de oameni cu care suntem obișnuiți. Acest lucru este doar din motive de eficiență. Este nevoie de mult mai puțin spațiu pentru a stoca un singur număr reprezentând secunde decât pentru a stoca valori separate pentru an, lună, oră etc.
Desigur, în termeni moderni, diferența de spațiu nu este deloc atât de mare. Dar luați în considerare că Unix a apărut la sfârșitul anilor 1960, când spațiul de stocare disponibil era mult mai mic. Marcajele de timp sunt, de asemenea, folosite foarte mult, astfel încât stocarea lor se adună. De exemplu, fiecare fișier are trei marcaje temporale asociate.
Formatul este aproape imposibil de transpus în capul tău decât dacă ești un geniu matematic. Dar are încă câteva avantaje față de alternative mai lizibile, cum ar fi miercuri, 21 oct 2015 07:28:00 GMT . Puteți comanda două marcaje temporale Unix foarte ușor, dintr-o privire. De asemenea, este de obicei mai rapid să stabiliți diferența dintre două marcaje temporale. Acest lucru este valabil mai ales pentru întâlnirile apropiate, cum ar fi zilele adiacente.
Despre Epocă
Deci, timpul Unix este un număr total de secunde de la un anumit moment în timp. Dar care este acel moment în timp? Este ora 00:00:00 UTC pe 1 ianuarie 1970 . Aceasta este adesea denumită Epoca Unix. Programatorii au ales această dată pentru epocă din comoditate, deoarece a fost cea mai apropiată dată rotundă când au inventat ora Unix.
Este posibil să fi văzut această dată când ceva nu a mers prost. Este clar un bug, dar unul care arată foarte ciudat atunci când rezultă o dată dinainte de momentul în care ne-am născut mulți dintre noi! Este complet de înțeles, totuși, când știi despre ora Unix. Dacă orice sistem încearcă să afișeze un marcaj de timp care nu are nicio valoare, acesta se va traduce adesea la 0 și va avea ca rezultat data exactă a epocii.
Strict vorbind, nu există. Tipul de date inițial a fost un număr întreg de 32 de biți, iar acest lucru rămâne adesea așa, chiar și în sisteme mult mai puternice.
Acest tip de date permite valorii să stocheze un total de 2^32 de secunde, ceea ce înseamnă puțin peste 136 de ani. Această valoare este de obicei semnată, ceea ce înseamnă că poate fi negativă sau pozitivă. Deci, de obicei reprezintă 68 de ani de ambele părți ale epocii, adică 1902-2038.
Aceasta este încă o perioadă limitată, desigur. Dar utilizarea principală a formatului de marcaj temporal a fost pentru concepte precum modificarea fișierului. Nevoia era foarte mare de a reprezenta timpul aproape de prezent, mai degrabă decât istoria antică sau departe în viitor. Chiar și pentru aplicații precum calendare, rareori este nevoie să se reprezinte date mai mult de câteva decenii în viitor.
Dar asta nu înseamnă că acest interval de timp limitat este fără probleme...
Problema anului 2038
Bug-ul Y2K ( una dintre cele mai grave greșeli de programare din istorie ) a afectat sistemele informatice care stocau anii ca valori de două cifre. Când a venit anul 2000, astfel de sisteme l-au tratat ca și cum ar fi fost 1900. În realitate, acest lucru nu a fost atât de catastrofal pe cât se temea, în principal pentru că mulți oameni au petrecut mult timp și efort în avans, pregătindu-se pentru asta.
Dacă ați acordat atenție în secțiunea anterioară, este posibil să fi observat o problemă similară care ar putea afecta ora Unix. Ei bine, ora Unix are o problemă proprie de date: problema Y2k38. (Este adesea menționată ca o problemă, nu o eroare; poate că am devenit mai optimiști din anul 2000!) Când timpul Unix se termină literalmente în 2038, sistemele vor trata datele noi fie ca 1902, fie ca 1970. Pur și simplu voi eșua cu totul.
Cel puțin această problemă nu ne va lovi în miezul nopții de Revelion. Ultima secundă a timpului Unix pe 32 de biți va cădea pe 19 martie. În eventualitate, probabil că vom actualiza majoritatea sistemelor până în 2038 sau oricum vor fi învechite până atunci.
Câteva resurse utile de marca temporală
Site-ul Epoch Converter este, probabil, cel mai cuprinzător convertor de marcaje temporale disponibile. Începe prin afișarea orei curente Unix - în timp real - și adaugă aproape toate caracteristicile imaginabile pe deasupra. Utilizarea sa principală este pentru conversia între marcaje temporale și date care pot fi citite de om, în ambele direcții.
Dan's Tools este o colecție imensă de aplicații web utile, dintre care una este un convertor de marcaj de timp . Este mai de bază, dar are o prezentare foarte curată și este ușor de utilizat.
Time.is prezintă un alt aspect, chiar mai minimalist. Afișează ora într-un număr de formate, inclusiv ora Unix. Include ora curentă în titlul paginii, ceea ce este util.
Pe Linux și macOS, programul de dată este utilitarul de bază pentru a trata data/ora, inclusiv marcajele de timp Unix. Apelat fără niciun argument, returnează data/ora curentă într-un format care poate fi citit de om:
$ date Wed Feb 10 12:28:30 GMT 2021
Dacă aveți nevoie de data/ora curentă în ora Unix, utilizați argumentul +%s :
$ date +%s 1612960114
Puteți face conversia dintr-o dată care poate fi citită de om într-o ștampilă de timp utilizând marcajul -d dacă versiunea dvs. de dată o acceptă. Majoritatea versiunilor Linux ar trebui, implicit:
$ date -d "Jan 2 1970" +%s 82800
Pe macOS, data este un program diferit, care necesită un set diferit de steaguri:
$ date -j -f "%b %d %Y %T" "Jan 02 1970 00:00:00" "+%s" 82800
Mergând în cealaltă direcție, puteți face conversia dintr-un marcaj temporal Unix folosind steag-ul -r :
$ date -r 1600000000 Sun 13 Sep 2020 13:26:40 BST
Alte programe folosesc formatul %s pentru a se ocupa de ora Unix. De exemplu, dacă doriți să afișați data modificării unui fișier în ora Unix, cu versiunea Linux a ls , puteți utiliza următoarele:
$ ls -l --time-style=+%s index.tmp.html -rw-r--r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html
Cum să utilizați timpul Unix în limbaje de programare
PHP are funcția time() care returnează marcajul temporal Unix curent. Funcția sa date() ia un marcaj temporal ca al doilea argument:
$ php -r 'echo date("Y-m-d", time());' 2021-02-11
JavaScript abordează lucrurile într-un mod interesant. Are o metodă Date.now() pentru a obține numărul de milisecunde de la epoca Unix. Desigur, puteți împărți acest lucru la 1.000 și rotunjiți rezultatul pentru a da timpul Unix echivalent în secunde:
> Math.floor(Date.now() / 1000) 1613083012
Înțelegerea timpului Unix
Ora Unix este un concept simplu care apare în multe locuri. Odată ce îl înțelegi, s-ar putea să-l găsești destul de util, la calcularea diferențelor de timp, de exemplu. De asemenea, puteți recunoaște când poate fi cauza anumitor erori.
Concepte precum epoca și marcajele de timp sunt o parte importantă a începerii cu Linux. Pentru a afla mai multe despre elementele esențiale, cum ar fi ls , consultați ghidul nostru pentru comenzile Linux de bază.