Kodėl „Unix“ turi savo laiko sampratą? Kas yra epocha ir kokia yra Y2038 problema?

„Unix“ laikas yra priemonė nurodyti konkrečią datą ir laiką, kurią naudoja „Linux“, „MacOS“ ir daugelis kitų sąveikių sistemų. Jis yra toks plačiai paplitęs, kad tikriausiai jį naudojate nežinodamas. Tačiau kai suprasite „Unix“ laiką, pastebėsite jį daugeliu atvejų. Keli įrankiai gali padėti dirbti su „Unix“ laiku.

Koks yra „Unix“ laiko tikslas?

„Unix“ laikas - tai visų sekundžių skaičius nuo nustatyto laiko ir datos. Tai yra datos / laiko (arba laiko žymos) formatas, kuris atrodo kitaip nei žmonėms įprasta skaityti datomis ir laikais. Tai grynai dėl efektyvumo. Vienam skaičiui, nurodančiam sekundes, įrašyti reikia daug mažiau vietos nei atskiroms metų, mėnesio, valandos ir kt. Reikšmėms.

Žinoma, šiuolaikiškai kalbant, erdvės skirtumas nėra toks didelis. Tačiau atsižvelkite į tai, kad „Unix“ atsirado 1960-ųjų pabaigoje, kai laisvos vietos buvo daug mažiau. Taip pat daug naudojama laiko žymių, todėl jų saugykla prisideda. Pavyzdžiui, kiekviename faile yra trys laiko žymės.

instagram viewer

Formato išversti į galvą beveik neįmanoma, nebent esate matematikos genijus. Tačiau jis vis tiek turi tam tikrų pranašumų, palyginti su labiau skaitomomis alternatyvomis, tokiomis kaip 2015 m. Spalio 21 d., Trečiadienis, 07:28:00 GMT. Galite lengvai užsisakyti dvi „Unix“ laiko žymes iš pirmo žvilgsnio. Taip pat paprastai greičiau nustatyti skirtumą tarp dviejų laiko žymių. Tai ypač pasakytina apie datas, esančias šalia, pavyzdžiui, gretimomis dienomis.

Apie epochą

Taigi, „Unix“ laikas yra bendras sekundžių skaičius nuo konkretaus laiko momento. Bet koks yra to laiko momentas? Tai yra 00:00:00 UTC ant 1970 m. Sausio 1 d. Tai dažnai vadinama Unix epocha. Programuotojai pasirinko šią epochos datą dėl patogumo, nes tai buvo artimiausia apvali data, kai jie išrado „Unix“ laiką.

Gerai galėjote pamatyti šią datą, kai kažkas nepavyko. Tai akivaizdžiai klaida, bet atrodo labai keistai, kai jos data yra ankstesnė už daugelio mūsų gimimo laiką! Vis dėlto tai visiškai suprantama, kai žinai apie „Unix“ laiką. Jei kuri nors sistema bando parodyti laiko žymę, kuri neturi jokios vertės, ji dažnai bus išversta į 0 ir bus nurodyta tiksli epochos data.

„Unix“ laiko duomenų formatas

Griežtai tariant, nėra vieno. Pradinis duomenų tipas buvo 32 bitų sveikasis skaičius, ir tai dažnai išlieka net daug galingesnėse sistemose.

Šis duomenų tipas leidžia išsaugoti vertę iš viso 2 ^ 32 sekundes, tai yra šiek tiek daugiau nei 136 metai. Ši reikšmė paprastai pasirašoma, o tai reiškia, kad ji gali būti neigiama arba teigiama. Taigi, paprastai tai reiškia 68 metus abiejose epochos pusėse, t. Y. 1902–2038 m.

Tai, žinoma, vis dar yra ribotas laikotarpis. Tačiau pagrindinis laiko žymos formatas buvo naudojamas tokioms sąvokoms kaip failo modifikavimas. Labai reikėjo reprezentuoti laiką, artimą dabartiui, o ne senovės istoriją ar toli į ateitį. Net ir tokiose programose kaip kalendoriai retai kada reikia pateikti datas daugiau nei kelis dešimtmečius į ateitį.

Bet tai nereiškia, kad šis ribotas laiko tarpas yra be problemų...

2038 metų problema

„Y2K“ klaida (viena blogiausių programavimo klaidų istorijoje) paveikė kompiuterines sistemas, kurios metus saugojo kaip dviženkles reikšmes. Kai atėjo 2000 metai, tokios sistemos elgėsi taip, lyg tai būtų 1900 m. Tuo atveju tai nebuvo taip katastrofiška, kaip bijota, daugiausia dėl to, kad daugelis žmonių iš anksto, ruošdamiesi tam, praleido daug laiko ir pastangų.

10 blogiausių programavimo klaidų istorijoje

Savo aukšta praeitimi taip pat koduojamas suklastotas naikinimas. Šiek tiek blogo kodo atvejai sukėlė didelę nelaimę. Toliau pateikiama 10 blogiausių programavimo klaidų istorijoje.

Jei atkreipėte dėmesį į ankstesnį skyrių, galbūt pastebėjote panašią problemą, kuri gali turėti įtakos „Unix“ laikui. Na, „Unix“ laikas turi savo duomenų problemą: Y2k38 problemą. (Tai dažnai vadinama problema, o ne klaida; gal nuo 2000 metų tapome optimistiškesni!) Kai 2038 m. „Unix“ laikas tiesiogine prasme baigsis, sistemos naujomis datomis laikys 1902 m. arba 1970 m. Arba galbūt jie apskritai nepavyks.

Bent ši problema mūsų nepasieks Naujųjų metų išvakarėse vidurnaktį. Paskutinė 32 bitų „Unix“ laiko sekundė nukris kovo 19 d. Tikėtina, kad daugumą sistemų atnaujinsime iki 2038 m., Kitaip jie vis tiek bus pasenę.

Kai kurie naudingi laiko žymos šaltiniai

Epochos keitiklis svetainė yra galbūt pats išsamiausias laiko žymių keitiklis. Tai prasideda rodant dabartinį „Unix“ laiką realiuoju laiku ir prideda beveik visas įsivaizduojamas savybes. Pagrindinė jo paskirtis yra konvertuoti laiko žymes ir žmonėms skaitomas datas į abi puses.

„Dan's Tools“ yra didžiulė naudingų žiniatinklio programų kolekcija, iš kurių viena yra laiko žymos keitiklis. Jis yra paprastesnis, tačiau yra labai švarus ir lengvai naudojamas.

Laikas.yra pateikia dar vieną, dar minimalistiškesnį vaizdą. Tai rodo laiką įvairiais formatais, įskaitant „Unix“ laiką. Į savo puslapio pavadinimą jis įtraukia esamą laiką, kuris yra naudingas.

„Linux“ ir „MacOS“ sistemose data programa yra pagrindinis įrankis tvarkant datą / laiką, įskaitant „Unix“ laiko žymes. Paskambinus be jokių argumentų, ji pateikia dabartinę datą / laiką žmonėms suprantamu formatu:

$ data
10 vasario 12:28:30 GMT 2021 m

Jei jums reikia dabartinės datos / laiko „Unix“ laiku, naudokite +% s argumentas:

$ data +% s
1612960114

Galite konvertuoti iš datos, kurią žmogus gali perskaityti, į laiko žymę naudodamas -d pažymėti, jei jūsų versija data palaiko tai. Pagal numatytuosius nustatymus dauguma „Linux“ versijų turėtų:

$ data -d "1970 m. sausio 2 d." +% s
82800

„MacOS“, data yra kita programa, kuriai reikalingas kitoks vėliavų rinkinys:

$ date -j -f "% b% d% Y% T" "1970 m. sausio 2 d. 00:00:00" "+% s"
82800

Eidami kita kryptimi, galite konvertuoti iš „Unix“ laiko žymos naudodami -r vėliava:

$ data -r 1600000000
2020 m. Rugsėjo 13 d., 13:26:40 BST

Kai kurios kitos programos naudoja % s formatas „Unix“ laikui spręsti. Pvz., Jei norite failo modifikavimo datą parodyti Unix laiku, naudokite Linux versija ls, galite naudoti šiuos veiksmus:

$ ls -l - time-style = +% s index.tmp.html
-rw-r - r-- 1 „ubuntu ubuntu“ 17862 1521649818 index.tmp.html

Kaip naudoti „Unix“ laiką programavimo kalbose

PHP turi laikas() funkcija, kuri grąžina dabartinę „Unix“ laiko žymę. Jo data() funkcija ima laiko žymę kaip antrą argumentą:

$ php -r 'aido data ("Y-m-d", laikas ());'
2021-02-11

„JavaScript“ prieina įdomiai. Tai turi Date.now () metodas gauti milisekundžių skaičių nuo „Unix“ epochos. Žinoma, galite tai padalyti iš 1000 ir suapvalinti rezultatą, kad sekundėmis gautumėte ekvivalentišką „Unix“ laiką:

> Math.floor (Data.dabar () / 1000)
1613083012

Unix laiko supratimas

Unix laikas yra paprasta sąvoka, kuri auga daugelyje vietų. Kai tai suprasite, jums gali būti naudinga, pavyzdžiui, apskaičiuojant laiko skirtumus. Taip pat galite atpažinti, kada tai gali būti tam tikrų klaidų priežastis.

Tokios sąvokos kaip epocha ir laiko žymos yra svarbi pradinė „Linux“ dalis. Norėdami sužinoti daugiau apie pagrindinius dalykus, pvz ls, peržiūrėkite pagrindinių Linux komandų vadovą.

El
9 pagrindinės komandos, leidžiančios pradėti naudotis „Linux“

Norite susipažinti su „Linux“? Pradėkite nuo šių pagrindinių „Linux“ komandų, kad išmoktumėte standartinių skaičiavimo užduočių.

Susijusios temos
  • Nenurodytas
Apie autorių
Bobis Džekas (Paskelbti 27 straipsniai)

Bobis yra technologijų entuziastas, kuris beveik du dešimtmečius dirbo programinės įrangos kūrėju. Jis aistringai žaidžia, dirba „Review Player“ žurnalo apžvalgų redaktoriumi ir yra pasinėręs į visus internetinės leidybos ir interneto kūrimo aspektus.

Daugiau iš Bobby Jacko

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kuriame rasite techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Dar vienas žingsnis…!

Prašome patvirtinti savo el. Pašto adresą el. Laiške, kurį jums ką tik išsiuntėme.

.