Timp Unix

Două straturi de codificare alcătuiesc timpul Unix. Primul strat codifică un punct în timp ca un număr real scalar care reprezintă numărul de secunde care au trecut de la 00:00:00 UTC joi, 1 ianuarie 1970. Al doilea strat codifică acel număr ca o secvență de biți sau de cifre zecimale.

Așa cum este standard cu UTC, acest articol etichetează zilele folosind calendarul gregorian și numără timpii din fiecare zi în ore, minute și secunde. Unele dintre exemple prezintă, de asemenea, Timpul Atomic Internațional (TAI), o altă schemă de timp care folosește aceleași secunde și este afișată în același format ca și UTC, dar în care fiecare zi are exact 86400 de secunde, pierzându-și treptat sincronizarea cu rotația Pământului cu o rată de aproximativ o secundă pe an.

Codificarea timpului ca numărEdit

Timpurile Unix sunt un singur număr cu semn care se incrementează la fiecare secundă, ceea ce îl face mai ușor de stocat și de manipulat de către calculatoare decât sistemele de date convenționale. Programele de interpretare îl pot converti apoi într-un format lizibil pentru oameni.

Epoca Unix este ora 00:00:00 UTC la 1 ianuarie 1970. Există o problemă cu această definiție, în sensul că UTC nu a existat în forma sa actuală până în 1972; această problemă este discutată mai jos. Pentru concizie, restul acestei secțiuni folosește formatul de dată și oră ISO 8601, în care epoca Unix este 1970-01-01T00:00:00:00Z.

Numărul de timp Unix este zero la epoca Unix și crește cu exact 86400 pe zi de la epocă. Astfel, 2004-09-16T00:00:00:00Z, la 12677 zile de la epocă, este reprezentat de numărul de timp Unix 12677 × 86400 = 1095292800. Acest lucru poate fi extins și în sens invers față de epocă, folosind numere negative; astfel, 1957-10-04T00:00:00Z, cu 4472 de zile înainte de epocă, este reprezentat de numărul de timp Unix -4472 × 86400 = -386380800. Acest lucru se aplică și în cadrul zilelor; numărul de timp la orice moment dat al unei zile este numărul de secunde care au trecut de la miezul nopții care a început în ziua respectivă, adăugat la numărul de timp de la miezul nopții respective.

Pentru că timpul Unix se bazează pe o epocă, și din cauza unei neînțelegeri comune că epoca Unix este singura epocă (adesea numită „epoca” ), timpul Unix este uneori denumit timp de epocă.

Secundele bisecundeEdit

Schema de mai sus înseamnă că într-o zi UTC normală, care are o durată de 86400 de secunde, numărul timpului Unix se modifică în mod continuu până la miezul nopții. De exemplu, la sfârșitul zilei utilizate în exemplele de mai sus, reprezentările temporale progresează după cum urmează:

Când are loc o secundă bisectă, ziua UTC nu are o durată exactă de 86400 de secunde, iar numărul de timp Unix (care crește întotdeauna cu exact 86400 în fiecare zi) cunoaște o discontinuitate. Secundele bisecunde pot fi pozitive sau negative. Nicio secundă bisectă negativă nu a fost declarată vreodată, dar dacă ar fi fost declarată, atunci la sfârșitul unei zile cu o secundă bisectă negativă, numărul timpului Unix ar fi sărit cu 1 până la începutul zilei următoare. În timpul unei secunde bisecunde pozitive la sfârșitul unei zile, care apare în medie la fiecare an și jumătate, numărul timpului Unix crește continuu până în ziua următoare în timpul secundei bisecunde și apoi, la sfârșitul secundei bisecunde, sare înapoi cu 1 (revenind la începutul zilei următoare). De exemplu, iată ce s-a întâmplat pe sistemele POSIX.1 strict conforme la sfârșitul anului 1998:

Numerele de timp Unix se repetă în secunda imediat următoare unei secunde bisecunde pozitive. Numărul de timp Unix 1483142400 este astfel ambiguu: se poate referi fie la începutul secundei bisecunde (2016-12-31 23:59:60), fie la sfârșitul acesteia, o secundă mai târziu (2017-01-01 00:00:00). În cazul teoretic în care apare o secundă bisectă negativă, nu se produce nicio ambiguitate, dar în schimb există un interval de numere de timp Unix care nu se referă deloc la niciun punct din timpul UTC.

Un ceas Unix este adesea implementat cu un tip diferit de gestionare a secundelor bisecunde pozitive asociate cu Network Time Protocol (NTP). Acest lucru generează un sistem care nu este conform cu standardul POSIX. Pentru detalii, a se vedea secțiunea de mai jos referitoare la NTP.

Când este vorba de perioade care nu cuprind o secundă bisectă UTC, diferența dintre două numere de timp Unix este egală cu durata în secunde a perioadei dintre punctele de timp corespunzătoare. Aceasta este o tehnică de calcul obișnuită. Cu toate acestea, atunci când apar secundele bisecunde, astfel de calcule dau un răspuns greșit. În aplicațiile în care este necesar acest nivel de acuratețe, este necesar să se consulte un tabel al secundelor bisecunde atunci când se lucrează cu ore Unix și este adesea preferabil să se utilizeze o altă codificare a timpului care nu suferă de această problemă.

Un număr de timp Unix este ușor de reconvertit în timp UTC prin luarea cvorumului și modulului numărului de timp Unix, modulo 86400. Cotientul este numărul de zile de la epocă, iar modulul este numărul de secunde de la miezul nopții UTC din ziua respectivă. În cazul în care este dat un număr de timp Unix care este ambiguu din cauza unei secunde bisecunde pozitive, acest algoritm îl interpretează ca fiind ora imediat după miezul nopții. Acesta nu generează niciodată o oră care se află în timpul unei secunde bisecunde. În cazul în care i se dă un număr de timp Unix care nu este valid din cauza unei secunde bisecunde negative, acesta generează o oră UTC la fel de invalidă. Dacă aceste condiții sunt semnificative, este necesar să se consulte un tabel al secundelor bisecunde pentru a le detecta.

Variantă nesincronă bazată pe Network Time ProtocolEdit

În mod obișnuit, un ceas Unix de tip Mills este implementat cu gestionarea secundelor bisecunde nesincronă cu schimbarea numărului de timp Unix. Numărul de timp scade inițial acolo unde ar fi trebuit să aibă loc un salt, iar apoi sare la ora corectă la 1 secundă după salt. Acest lucru facilitează implementarea și este descris în lucrarea lui Mills. Iată ce se întâmplă peste o secundă de salt pozitivă:

Acest lucru poate fi decodificat corect dacă se acordă atenție variabilei de stare a secundei de salt, care indică fără ambiguitate dacă saltul a fost deja efectuat. Schimbarea variabilei de stare este sincronă cu saltul.

O situație similară apare cu o secundă bisectă negativă, unde secunda care este sărită este puțin prea târziu. Foarte scurt timp, sistemul afișează un număr de timp nominal imposibil, dar acest lucru poate fi detectat de starea TIME_DEL și poate fi corectat.

În acest tip de sistem, numărul de timp Unix încalcă POSIX în jurul ambelor tipuri de secunde bisectoriale. Colectarea variabilei de stare a secundei bisecunde împreună cu numărul de timp permite o decodificare neambiguă, astfel încât numărul de timp POSIX corect poate fi generat, dacă se dorește, sau ora UTC completă poate fi stocată într-un format mai adecvat.

Logica de decodificare necesară pentru a face față acestui stil de ceas Unix ar decodifica corect și un ceas ipotetic conform POSIX care utilizează aceeași interfață. Acest lucru ar fi realizat prin indicarea stării TIME_INS pe parcursul întregii secunde bisecunde inserate, apoi indicând TIME_WAIT pe parcursul întregii secunde următoare, în timp ce se repetă numărarea secundelor. Acest lucru necesită gestionarea sincronă a secundei bisecunde. Acesta este probabil cel mai bun mod de a exprima timpul UTC sub forma unui ceas Unix, prin intermediul unei interfețe Unix, atunci când ceasul de bază este în mod fundamental netulburat de secundele bisecunde.

Varianta bazată pe TAIEdit

Acuratețea faptică a acestei secțiuni este contestată. Discuții relevante pot fi găsite pe Talk:Unix time. Vă rugăm să ajutați să vă asigurați că afirmațiile disputate au o sursă fiabilă. (Aprilie 2016) (Aflați cum și când să eliminați acest mesaj șablon)

O altă variantă neconformă, mult mai rară, de păstrare a timpului Unix implică codificarea TAI mai degrabă decât UTC; unele sisteme Linux sunt configurate în acest fel. Deoarece TAI nu are secunde bisecte, iar fiecare zi TAI are o lungime exactă de 86400 de secunde, această codificare este de fapt o numărătoare liniară pură a secundelor scurse din 1970-01-01T00:00:00 TAI. Acest lucru face ca aritmetica intervalelor de timp să fie mult mai ușoară. Valorile de timp din aceste sisteme nu suferă de ambiguitatea pe care o au sistemele POSIX strict conforme sau sistemele bazate pe NTP.

În aceste sisteme este necesar să se consulte un tabel cu secundele bisecunde pentru a converti corect între UTC și reprezentarea pseudo-Unix-time. Acest lucru se aseamănă cu modul în care trebuie consultate tabelele de fus orar pentru a converti la și de la ora civilă; baza de date IANA privind fusul orar include informații despre secundele bisecunde, iar codul de exemplu disponibil din aceeași sursă utilizează aceste informații pentru a converti între marcajele temporale bazate pe TAI și ora locală. Conversia se lovește, de asemenea, de probleme de definiție înainte de începerea în 1972 a formei actuale a UTC (a se vedea secțiunea Baza UTC de mai jos).

Acest sistem bazat pe TAI, în ciuda asemănării superficiale, nu este timpul Unix. Acesta codifică orele cu valori care diferă cu câteva secunde față de valorile timpului POSIX. O versiune a acestui sistem a fost propusă pentru a fi inclusă în standardul time.h al ISO C, dar numai partea UTC a fost acceptată în 2011. Un tai_clock există, totuși, în C++20.

Reprezentarea număruluiEdit

Un număr de timp Unix poate fi reprezentat în orice formă capabilă să reprezinte numere. În unele aplicații, numărul este reprezentat pur și simplu textual ca un șir de cifre zecimale, ridicând doar probleme suplimentare triviale. Cu toate acestea, anumite reprezentări binare ale timpilor Unix sunt deosebit de semnificative.

Tipul de date Unix time_t care reprezintă un punct în timp este, pe multe platforme, un întreg cu semn, în mod tradițional de 32 de biți (dar a se vedea mai jos), care codifică direct numărul de timp Unix așa cum este descris în secțiunea precedentă. Fiind de 32 de biți, înseamnă că acoperă un interval de aproximativ 136 de ani în total. Data minimă reprezentabilă este vineri 1901-12-13, iar data maximă reprezentabilă este marți 2038-01-19. La o secundă după ora 03:14:07 UTC 2038-01-19, această reprezentare se va supraîncărca. Această piatră de hotar este anticipată cu un amestec de amuzament și teamă – vezi problema anului 2038.

În unele sisteme de operare mai noi, time_t a fost lărgit la 64 de biți. Acest lucru extinde timpii reprezentabili cu aproximativ 293 de miliarde de ani în ambele direcții, ceea ce reprezintă de peste douăzeci de ori vârsta actuală a universului în fiecare direcție.

Apoi a existat inițial o controversă cu privire la faptul dacă time_t din Unix ar trebui să fie cu semn sau fără semn. Dacă era fără semn, intervalul său în viitor ar fi fost dublat, amânând depășirea pe 32 de biți (cu 68 de ani). Cu toate acestea, ar fi atunci incapabil să reprezinte momente anterioare epocii. Consensul este ca time_t să fie semnată, iar aceasta este practica obișnuită. Platforma de dezvoltare software pentru versiunea 6 a sistemului de operare QNX are un time_t pe 32 de biți fără semn, deși versiunile mai vechi foloseau un tip semnat.

Specificațiile POSIX și Open Group Unix includ biblioteca standard C, care include tipurile de timp și funcțiile definite în fișierul antet <time.h>. Standardul ISO C afirmă că time_t trebuie să fie un tip aritmetic, dar nu impune un tip sau o codificare specifică pentru acesta. POSIX cere ca time_t să fie un tip întreg, dar nu impune ca acesta să fie semnat sau nesemnat.

Unix nu are o tradiție de reprezentare directă a numerelor de timp Unix care nu sunt numere întregi ca fracții binare. În schimb, timpii cu precizie sub o secundă sunt reprezentați folosind tipuri de date compozite care constau din două numere întregi, primul fiind un time_t (partea integrală a timpului Unix), iar al doilea fiind partea fracționară a numărului de timp în milionimi (în struct timeval) sau miliardimi (în struct timespec). Aceste structuri oferă un format de date în virgulă fixă pe bază de zecimale, care este util pentru unele aplicații și banal de convertit pentru altele.

Baza UTCEdit

Forma actuală a UTC, cu secundele bisecunde, este definită doar începând cu 1 ianuarie 1972. Înainte de aceasta, de la 1 ianuarie 1961 a existat o formă mai veche de UTC în care nu numai că existau pași de timp ocazionali, care erau cu numere neintegrale de secunde, dar, de asemenea, secunda UTC era puțin mai lungă decât secunda SI și se modifica periodic pentru a se apropia continuu de rotația Pământului. Înainte de 1961 nu a existat UTC, iar înainte de 1958 nu a existat un sistem de măsurare a timpului atomic pe scară largă; în aceste epoci, în locul unei scări temporale atomice se folosea o oarecare aproximare a GMT (bazată direct pe rotația Pământului).

Definirea precisă a timpului Unix ca o codificare a UTC este necontroversată doar atunci când este aplicată la forma actuală a UTC. Epoca Unix anterioară începerii acestei forme de UTC nu afectează utilizarea sa în această epocă: numărul de zile de la 1 ianuarie 1970 (epoca Unix) până la 1 ianuarie 1972 (începutul UTC) nu este în discuție, iar numărul de zile este tot ceea ce este semnificativ pentru timpul Unix.

Semnificația valorilor timpului Unix sub +63072000 (adică înainte de 1 ianuarie 1972) nu este definită cu precizie. Baza acestor ore Unix este cel mai bine înțeleasă ca fiind o aproximare nespecificată a UTC. Computerele din acea epocă rareori aveau ceasuri reglate cu suficientă precizie pentru a furniza, în orice caz, marcaje temporale semnificative la sub-secunde. Ora Unix nu este o modalitate adecvată de reprezentare a orelor anterioare anului 1972 în aplicațiile care necesită o precizie de sub o secundă; astfel de aplicații trebuie, cel puțin, să definească ce formă de UT sau GMT folosesc.

Începând cu 2009, se ia în considerare posibilitatea de a pune capăt utilizării secundelor bisecunde în timpul civil. O modalitate probabilă de a executa această schimbare este de a defini o nouă scală de timp, numită Ora Internațională, care inițial se potrivește cu UTC, dar care, ulterior, nu are secunde săritoare, rămânând astfel la un decalaj constant față de TAI. Dacă se întâmplă acest lucru, este probabil ca timpul Unix să fie definit prospectiv în funcție de această nouă scală de timp, în loc de UTC. Incertitudinea cu privire la faptul că acest lucru se va întâmpla nu face ca timpul Unix prospectiv să fie mai puțin previzibil decât este deja: dacă UTC nu ar mai avea pur și simplu nicio secundă bisectă, rezultatul ar fi același.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.