Hvorfor har Unix sitt eget tidsbegrep? Hva er epoken og hva er Y2038-problemet?
Unix-tid er et middel til å representere en bestemt dato og tid, brukt av Linux, macOS og mange andre interoperable systemer. Det er så utbredt at du sannsynligvis bruker det uten å være klar over det. Når du først har forstått Unix-tid, vil du få øye på den i mange sammenhenger. Flere verktøy kan hjelpe deg å jobbe med Unix-tid.
Hva er formålet med Unix Time?
Unix-tid er et antall totale sekunder siden en fast tid og dato. Det er et dato / klokkeslett (eller tidsstempel) format som ser annerledes ut enn de menneskelig lesbare datoene og tidspunktene vi er vant til. Dette er bare av effektivitetshensyn. Det tar mye mindre plass å lagre et enkelt tall som representerer sekunder enn det gjør å lagre separate verdier for året, måneden, timen osv.
Selvfølgelig, i moderne termer, er ikke romforskjellen så mye i det hele tatt. Men tenk at Unix stammer fra slutten av 1960-tallet da tilgjengelig lagring var langt mindre. Tidsstempler brukes også mye, så lagringen deres legger opp. For eksempel har hver fil tre tidsstempler knyttet til seg.
Formatet er ganske umulig å oversette i hodet, med mindre du er et matematisk geni. Men det har fortsatt noen fordeler fremfor mer lesbare alternativer som Onsdag 21. oktober 2015 07:28:00 GMT. Du kan enkelt bestille to Unix-tidsstempler. Det er også raskere å regne ut forskjellen mellom to tidsstempler. Dette gjelder spesielt for datoer nær hverandre, for eksempel på tilstøtende dager.
Om epoken
Så Unix-tiden er totalt antall sekunder siden et bestemt tidspunkt. Men hva er det tidspunktet? Det er 00:00:00 UTC på 1. januar 1970. Dette blir ofte referert til som Unix Epoch. Programmører valgte denne datoen for epoken av bekvemmelighet siden den var den nærmeste runde datoen da de oppfant Unix-tiden.
Du kan godt ha sett denne datoen da noe har gått galt. Det er tydeligvis en feil, men en som ser veldig rart ut når den resulterer i en dato fra før mange av oss ble født! Det er imidlertid forståelig når du vet om Unix-tid. Hvis et system prøver å vise et tidsstempel som ikke har noen verdi, vil det ofte oversettes til 0 og resultere i den eksakte datoen for epoken.
Unix tidsdataformat
Strengt tatt er det ikke en. Den opprinnelige datatypen var et 32-biters heltall, og dette forblir ofte tilfelle, selv i mye kraftigere systemer.
Denne datatypen lar verdien lagre totalt 2 ^ 32 sekunder, som er litt over 136 år. Denne verdien er vanligvis signert, noe som betyr at den kan være negativ eller positiv. Så det representerer vanligvis 68 år på hver side av epoken, dvs. 1902-2038.
Dette er selvfølgelig fortsatt en begrenset periode. Men den primære bruken av tidsstempelformatet var for begreper som filendring. Behovet var i stor grad å representere tiden nær nåtiden, snarere enn antikkens historie eller langt inn i fremtiden. Selv for applikasjoner som kalendere er det sjelden behov for å representere datoer mer enn noen tiår fremover.
Men det betyr ikke at denne begrensede tidsperioden er uten problemer...
Årets 2038-problem
Y2K Bug (en av de verste programmeringsfeilene i historien) berørte datasystemer som lagret år som tosifrede verdier. Da året 2000 kom rundt, behandlet slike systemer det som om det var 1900. I tilfelle var dette ikke så katastrofalt som fryktet, hovedsakelig fordi mange mennesker brukte mye tid og krefter på forhånd på å forberede seg på det.
I sin fortid fortid, koding smidde ødeleggelse også. Forekomster av litt dårlig kode forårsaket katastrofe på stort nivå. Følgende er 10 av de verste programmeringsfeilene i historien.
Hvis du var oppmerksom i forrige avsnitt, har du kanskje oppdaget et lignende problem som kan påvirke Unix-tiden. Vel, Unix-tid har et eget dataproblem: Y2k38-problemet. (Det blir ofte referert til som et problem, ikke en feil; kanskje vi har blitt mer optimistiske siden år 2000!) Når Unix-tiden bokstavelig talt går ut i 2038, vil systemene behandle nye datoer enten som 1902 eller 1970. Eller muligens vil de bare mislykkes helt.
I det minste vil ikke dette problemet treffe oss ved midnatt på nyttårsaften. Det siste sekundet av 32-biters Unix-tid faller 19. mars. Eventuelt vil vi sannsynligvis oppgradere de fleste systemer innen 2038, ellers vil de uansett være foreldet da.
Noen nyttige tidsstempelressurser
De Epoch Converter nettstedet er muligens den mest omfattende tidsstempelkonvertereren tilgjengelig. Det begynner med å vise den nåværende Unix-tiden - i sanntid - og legger til nesten alle tenkelige funksjoner på toppen av det. Hovedbruken er å konvertere mellom tidsstempler og lesbare datoer, i begge retninger.
Dan’s Tools er en enorm samling nyttige webapps, hvorav den ene er en tidsstempelkonverterer. Den er mer grunnleggende, men har en veldig ren presentasjon og er enkel å bruke.
Tiden er presenterer et annet, enda mer minimalistisk utseende. Den viser tid i en rekke formater, inkludert Unix-tid. Den inkluderer gjeldende tid i sidetittelen som er nyttig.
På Linux og macOS, er Dato programmet er kjerneprogrammet for å håndtere dato / tid, inkludert Unix-tidsstempler. Kalt uten argumenter, returnerer den gjeldende dato / klokkeslett i et lesbart format:
$ date
Ons 10. februar 12:28:30 GMT 2021
Hvis du trenger gjeldende dato / tid i Unix-tid, bruk +% s argument:
$ date +% s
1612960114
Du kan konvertere fra en menneskelig lesbar dato til en tidsstempel ved hjelp av -d flagg hvis din versjon av Dato støtter det. De fleste Linux-versjoner bør som standard:
$ date -d "2. januar 1970" +% s
82800
På macOS, Dato er et annet program, som krever et annet sett med flagg:
$ date -j -f "% b% d% Y% T" "02 jan 1970 00:00:00" "+% s"
82800
Å gå i den andre retningen, kan du konvertere fra et Unix-tidsstempel ved hjelp av -r flagg:
$ date -r 1600000000
Søn 13 sep 2020 13:26:40 BST
Noen andre programmer bruker % s format for å håndtere Unix-tid. Hvis du for eksempel vil vise endringsdatoen for en fil i Unix-tid, med Linux-versjon av ls, kan du bruke følgende:
$ ls -l --time-style = +% s index.tmp.html
-rw-r - r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html
Hvordan bruke Unix Time i programmeringsspråk
PHP har tid() funksjon som returnerer gjeldende Unix-tidsstempel. Det er Dato() funksjon tar et tidsstempel som sitt andre argument:
$ php -r 'ekkodato ("Y-m-d", tid ());'
2021-02-11
JavaScript nærmer seg ting på en interessant måte. Den har en Dato. Nå () metode for å få antall millisekunder siden Unix-epoken. Selvfølgelig kan du dele dette med 1000 og runde resultatet for å gi tilsvarende Unix-tid i sekunder:
> Math.floor (Date.now () / 1000)
1613083012
Forstå Unix Time
Unix time er et enkelt konsept som vokser opp mange steder. Når du forstår det, kan det hende du synes det er ganske nyttig når du for eksempel beregner tidsforskjeller. Du kan også kjenne igjen når det kan være årsaken til visse feil.
Konsepter som epoke og tidsstempler er en viktig del av å komme i gang med Linux. For å finne ut mer om vesentlige ting som ls, sjekk ut vår guide til grunnleggende Linux-kommandoer.
Vil du bli kjent med Linux? Start med disse grunnleggende Linux-kommandoene for å lære standard databehandling.
- Uspesifisert

Bobby er en teknologientusiast som jobbet som programvareutvikler i det meste av to tiår. Han brenner for spill, jobber som Reviews Editor i Switch Player Magazine, og er oppslukt av alle aspekter av online publisering og nettutvikling.
Abonner på vårt nyhetsbrev
Bli med på nyhetsbrevet vårt for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!
Ett steg til…!
Bekreft e-postadressen din i e-posten vi nettopp sendte deg.