Concepțiile greșite ale programatorilor despre ora Unix

imi cer scuze Patrick McKenzie.

ieri Danny Am întrebat despre câteva fapte interesante despre timpul Unix și mi-am amintit că uneori funcționează complet neintuitiv.

Aceste trei fapte par extrem de rezonabile și logice, nu-i așa?

  1. Ora Unix este numărul de secunde de la 1 ianuarie 1970 00:00:00 UTC.
  2. Dacă așteptați exact o secundă, ora Unix se va schimba cu exact o secundă.
  3. Timpul Unix nu se mișcă niciodată înapoi.

Nimic din toate acestea nu este adevărat.

Dar nu este suficient să spui pur și simplu „Nimic din toate acestea nu este adevărat”, fără a explica. de ce. Vezi mai jos pentru explicații. Dar dacă vrei să gândești singur, nu trece pe lângă imaginea ceasului!

Concepțiile greșite ale programatorilor despre ora Unix
Ceas de masă din anii 1770. Compilat de John Leroux. Din Bine ai venit colectii. Publicat sub licență CC BY

Toate cele trei concepții greșite au un singur motiv: secunde bisecătoare. Dacă nu sunteți familiarizat cu secundele sărace, iată o referință rapidă:

Ora UTC este determinată de doi factori:

  • Ora atomică internațională: citiri medii de la sute de ceasuri atomice din întreaga lume. Putem măsura pe al doilea după proprietățile electromagnetice ale unui atom și aceasta este cea mai precisă măsurătoare a timpului cunoscută de știință.
  • Ora mondială, bazată pe rotația Pământului în jurul propriei axe. O revoluție completă este o zi.

Problema este că aceste două numere nu se potrivesc întotdeauna. Rotația Pământului nu este consistentă - încetinește treptat, astfel încât zilele din Timpul Universal devin mai lungi. Pe de altă parte, ceasurile atomice sunt diabolic de precise și constante de-a lungul a milioane de ani.

Când două ori nu se sincronizează, o secundă este adăugată sau eliminată din UTC pentru a le readuce în sincronizare. Din 1972 service IERS (care rulează acest caz) a adăugat 27 de secunde în plus. Rezultatul a fost 27 de zile UTC cu o durată de 86 secunde. Teoretic, este posibilă o zi cu o durată de 401 de secunde (minus una). Ambele opțiuni contrazic ipoteza fundamentală a timpului Unix.

Ora Unix presupune că fiecare zi durează exact 86 de secunde (400 × 60 × 60 = 24), fără secunde suplimentare. Dacă apare un astfel de salt, atunci timpul Unix fie sare cu o secundă, fie numără două secunde într-una. Din 86, îi lipsesc 400 de secunde sărace.

Deci, concepțiile noastre greșite trebuie completate după cum urmează:

  • Ora Unix este numărul de secunde de la 1 ianuarie 1970 00:00:00 UTC minus secunde de sarcină.
  • Dacă așteptați exact o secundă, ora Unix se va schimba cu exact o secundă, cu excepția cazului în care secunda intercalată a fost eliminată.

    Până acum, secundele nu au fost niciodată eliminate în practică (și încetinirea rotației Pământului înseamnă că acest lucru este puțin probabil), dar dacă s-ar întâmpla vreodată, ar însemna că ziua UTC ar deveni cu o secundă mai scurtă. În acest caz, ultima secundă a UTC (23:59:59) este eliminată.

    Fiecare zi Unix are același număr de secunde, astfel încât ultima secundă Unix dintr-o zi scurtată nu va corespunde niciunei ore UTC. Iată cum arată, la intervale de un sfert de secundă:

    Concepțiile greșite ale programatorilor despre ora Unix

    Dacă începeți la 23:59:58:00 UTC și așteptați o secundă, ora Unix va avansa cu două secunde UTC și marca temporală Unix 101 nu va fi atribuită nimănui.

  • Timpul Unix nu se poate întoarce niciodată, până când se adaugă o secundă bisecătoare.

    Acest lucru s-a întâmplat deja de 27 de ori în practică. La sfârșitul zilei UTC, se adaugă o secundă suplimentară la 23:59:60. Unix are același număr de secunde într-o zi, așa că nu poate adăuga o secundă în plus - în schimb trebuie să repete marcajele de timp Unix pentru ultima secundă. Iată cum arată, la intervale de un sfert de secundă:

    Concepțiile greșite ale programatorilor despre ora Unix

    Dacă începeți la 23:59:60.50 și așteptați o jumătate de secundă, ora Unix se întoarce cu o jumătate de secundă, iar marcajul temporal Unix 101 corespunde la două secunde UTC.

Acestea nu sunt probabil singurele ciudatenii ale vremurilor Unix - doar ceea ce mi-am amintit ieri.

Timp - foarte lucru ciudat.

Sursa: www.habr.com

Adauga un comentariu