Zašto Unix ima svoj koncept vremena? Koja je epoha i koji je problem Y2038?
Unix vrijeme je sredstvo predstavljanja određenog datuma i vremena koje koriste Linux, macOS i mnogi drugi interoperabilni sustavi. Toliko je raširen da ga vjerojatno koristite, a da toga niste svjesni. Jednom kad shvatite vrijeme Unixa, primijetit ćete ga u mnogim kontekstima. Nekoliko alata može vam pomoći u radu s Unix vremenom.
Koja je svrha Unix vremena?
Unix vrijeme broji ukupne sekunde od određenog vremena i datuma. To je format datuma / vremena (ili vremenske oznake) koji se razlikuje od čitljivih datuma i vremena na koje smo navikli. To je isključivo iz razloga učinkovitosti. Potrebno je puno manje prostora za pohranu jednog broja koji predstavlja sekunde nego za pohranu zasebnih vrijednosti za godinu, mjesec, sat itd.
Naravno, u modernom smislu prostorna razlika uopće nije toliko velika. Ali uzmite u obzir da je Unix nastao krajem 1960-ih kada je raspoloživa pohrana bila daleko manja. Vremenske se marke također često koriste, pa se njihova pohrana zbraja. Na primjer, svaka datoteka ima tri vremenske oznake povezane s njom.
Format je gotovo nemoguće prevesti u glavi ako niste matematički genij. Ali još uvijek ima neke prednosti u odnosu na čitljivije alternative poput Srijeda, 21. listopada 2015. 07:28:00 GMT. Vrlo brzo možete naručiti dvije Unix vremenske marke. Također je brže riješiti razliku između dvije vremenske oznake. To se posebno odnosi na datume koji su bliski, poput susjednih dana.
O Epohi
Dakle, Unix vrijeme je ukupni broj sekundi od određenog trenutka u vremenu. Ali koji je to trenutak u vremenu? To je 00:00:00 UTC na 1. siječnja 1970. To se često naziva Unix Epochom. Programeri su ovaj datum odabrali iz praktičnosti jer je to bio najbliži okrugli datum kada su izmislili Unix vrijeme.
Možda ste dobro vidjeli ovaj datum kad je nešto pošlo po zlu. To je očito greška, ali ona koja izgleda vrlo čudno kad rezultira datumom prije vremena kada smo se mnogi od nas rodili! Potpuno je razumljivo kad znate za vrijeme Unixa. Ako bilo koji sustav pokušava prikazati vremensku oznaku koja nema nikakvu vrijednost, često će se prevesti na 0 i rezultirati točnim datumom epohe.
Oblik podataka o vremenu u Unixu
Strogo govoreći, nema ga. Izvorni tip podataka bio je 32-bitni cijeli broj, a to često ostaje slučaj, čak i u puno moćnijim sustavima.
Ovaj tip podataka omogućuje da vrijednost pohrani ukupno 2 ^ 32 sekunde, što je nešto više od 136 godina. Ova je vrijednost obično potpisana, što znači da može biti negativna ili pozitivna. Dakle, to obično predstavlja 68 godina s obje strane epohe tj. 1902-2038.
Ovo je naravno ograničeno razdoblje. Ali primarna upotreba formata vremenske oznake bila je za koncepte kao što je izmjena datoteke. Trebalo je predstaviti vrijeme blisko sadašnjosti, umjesto drevne povijesti ili daleke budućnosti. Čak i za aplikacije poput kalendara rijetko postoji potreba za predstavljanjem datuma više od nekoliko desetljeća u budućnosti.
Ali to ne znači da je ovaj ograničeni vremenski raspon bez problema...
Problem 2038. godine
Y2K Bug (jedna od najgorih programskih pogrešaka u povijesti) utjecali na računalne sustave koji su godine pohranili kao dvoznamenkaste vrijednosti. Kad je nastupila 2000. godina, takvi su se sustavi prema njoj odnosili kao da je 1900. godina. U slučaju, ovo nije bilo toliko katastrofalno koliko se bojalo, uglavnom zato što su mnogi ljudi potrošili puno vremena i truda unaprijed, pripremajući se za to.
U svojoj katoličkoj prošlosti, kodiranje također uzrokovano uništavanje. Primjeri malo lošeg koda izazvali su katastrofu na glavnoj razini. Slijedi 10 najgorih programskih pogrešaka u povijesti.
Ako ste obraćali pažnju u prethodnom odjeljku, možda ste primijetili sličan problem koji bi mogao utjecati na vrijeme Unixa. Pa, Unix time ima vlastiti problem s podacima: problem Y2k38. (To se često naziva problemom, a ne greškom; možda smo postali optimističniji od 2000. godine!) Kad Unix vrijeme doslovno istječe 2038., sustavi će nove datume tretirati ili kao 1902. ili 1970. Ili će možda jednostavno potpuno propasti.
Barem nas ovaj problem neće pogoditi u ponoć na Silvestrovo. Posljednja sekunda 32-bitnog vremena Unixa pasti će se 19. ožujka. U slučaju da ćemo većinu sustava vjerojatno nadograditi do 2038. ili će ionako zastarjeti do tada.
Neki korisni resursi s vremenskom oznakom
The Pretvarač epoha web stranica je vjerojatno najopsežniji dostupni pretvarač vremenskih žigova. Počinje prikazivanjem trenutnog Unix vremena - u stvarnom vremenu - i povrh toga dodaje gotovo sve zamislive značajke. Njegova je glavna upotreba za pretvaranje između vremenskih žigova i čitljivih datuma, u oba smjera.
Dan’s Tools ogromna je kolekcija korisnih web aplikacija, od kojih je jedna pretvarač vremenskih žigova. Osnovnije je, ali ima vrlo čistu prezentaciju i jednostavan je za upotrebu.
Vrijeme je predstavlja još jedan, još minimalističkiji izgled. Prikazuje vrijeme u brojnim formatima, uključujući Unix vrijeme. U naslov stranice uključuje korisno trenutno vrijeme.
Na Linuxu i macOS-u, datum program je osnovni uslužni program za bavljenje datumom / vremenom, uključujući vremenske oznake Unix. Pozvan bez ikakvih argumenata, vraća trenutni datum / vrijeme u čitljivom formatu:
$ datum
Srijeda, 10. veljače 12:28:30 GMT 2021
Ako vam je potreban trenutni datum / vrijeme u Unix vremenu, upotrijebite +% s argument:
$ datum +% s
1612960114
Možete pretvoriti iz čitljivog datuma u vremensku oznaku pomoću -d zastava ako je vaša verzija datum podržava ga. Većina verzija Linuxa trebala bi prema zadanim postavkama:
$ date -d "02. siječnja 1970" +% s
82800
Na macOS-u, datum je drugačiji program koji zahtijeva drugačiji skup zastavica:
$ date -j -f "% b% d% Y% T" "02. januar 1970 00:00:00" "+% s"
82800
Idući u drugom smjeru, možete pretvoriti iz Unix vremenske oznake pomoću -r zastava:
$ datum -r 1600000000
Nedjelja 13 rujna 2020 13:26:40 BST
Neki drugi programi koriste % s formatu za rješavanje Unix vremena. Na primjer, ako želite prikazati datum izmjene datoteke u Unix vremenu, pomoću Linux inačica ls, možete koristiti sljedeće:
$ ls -l --time-style = +% s index.tmp.html
-rw-r - r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html
Kako koristiti Unix vrijeme u programskim jezicima
PHP ima vrijeme() funkcija koja vraća trenutnu vremensku oznaku Unixa. Njegova datum() funkcija uzima vremenski žig kao drugi argument:
$ php -r 'datum odjeka ("Y-m-d", vrijeme ());'
2021-02-11
JavaScript stvarima pristupa na zanimljiv način. Ono ima Date.now () metoda za dobivanje broja milisekundi od epohe Unix. Naravno, to možete podijeliti s 1.000 i zaokružiti rezultat da biste dobili ekvivalentno vrijeme Unixa u sekundama:
> Matematički pod (Date.now () / 1000)
1613083012
Razumijevanje Unix vremena
Unix vrijeme jednostavan je koncept koji se pojavljuje na mnogim mjestima. Jednom kad ga shvatite, možda će vam biti vrlo korisno, na primjer, pri izračunavanju vremenskih razlika. Također možete prepoznati kada je to možda uzrok određenih bugova.
Koncepti poput epohe i vremenskih žigova važan su dio početka rada s Linuxom. Da biste saznali više o osnovnim stvarima kao što su ls, pogledajte naš vodič za osnovne Linux naredbe.
Želite li upoznati Linux? Započnite s ovim osnovnim Linux naredbama da biste naučili standardne računalne zadatke.
- Nespecificirano
Bobby je tehnološki entuzijast koji je većinu dva desetljeća radio kao programer softvera. Zaljubljen je u igre, radeći kao urednik recenzija u časopisu Switch Player, i uživan je u svim aspektima internetskog izdavanja i web razvoja.
Pretplatite se na naše obavijesti
Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e-knjige i ekskluzivne ponude!
Još jedan korak…!
Potvrdite svoju e-adresu u e-pošti koju smo vam upravo poslali.