Hvorfor har Unix sit eget tidsbegreb? Hvad er epoken, og hvad er Y2038-problemet?

Unix-tid er et middel til at repræsentere en bestemt dato og et klokkeslæt, der bruges af Linux, macOS og mange andre interoperable systemer. Det er så udbredt, at du sandsynligvis bruger det uden at være opmærksom på det. Når du først har forstået Unix-tiden, vil du få øje på det i mange sammenhænge. Flere værktøjer kan hjælpe dig med at arbejde med Unix-tid.

Hvad er formålet med Unix Time?

Unix-tid er et antal totale sekunder siden en fast tid og dato. Det er et dato / klokkeslæt (eller tidsstempel) -format, der ser anderledes ud end de menneskelige læsbare datoer og tidspunkter, vi er vant til. Dette er udelukkende af effektivitetshensyn. Det tager meget mindre plads at gemme et enkelt tal, der repræsenterer sekunder, end det gør at gemme separate værdier for året, måneden, timen osv.

I moderne termer er pladsforskellen naturligvis slet ikke så meget. Men overvej, at Unix opstod i slutningen af ​​1960'erne, da tilgængelig lagerplads var langt mindre. Tidsstempler bruges også meget, så deres opbevaring tilføjes. For eksempel har hver fil tre tidsstempler tilknyttet.

instagram viewer

Formatet er stort set umuligt at oversætte i dit hoved, medmindre du er et matematisk geni. Men det har stadig nogle fordele i forhold til mere læsbare alternativer som f.eks Onsdag, 21. oktober 2015 07:28:00 GMT. Du kan nemt bestille to Unix-tidsstempler. Det er også normalt hurtigere at finde ud af forskellen mellem to tidsstempler. Dette gælder især for datoer tæt sammen, f.eks. På tilstødende dage.

Om epoken

Så Unix-tid er et samlet antal sekunder siden et bestemt tidspunkt. Men hvad er det tidspunkt? Det er det 00:00:00 UTC 1. januar 1970. Dette kaldes ofte Unix Epoch. Programmører valgte denne dato ud af bekvemmeligheden, da det var den nærmeste runde dato, da de opfandt Unix-tiden.

Du har muligvis set denne dato, når noget er gået galt. Det er helt klart en fejl, men en der ser meget mærkelig ud, når den resulterer i en dato fra før det tidspunkt, hvor mange af os blev født! Det er dog helt forståeligt, når du ved om Unix-tid. Hvis et system forsøger at vise et tidsstempel, der ikke har nogen værdi, oversættes det ofte til 0 og resulterer i den nøjagtige epoke-dato.

Unix tidsdataformat

Strengt taget er der ikke en. Den oprindelige datatype var et 32-bit heltal, og dette forbliver ofte tilfældet, selv i meget mere kraftfulde systemer.

Denne datatype tillader værdien at lagre i alt 2 ^ 32 sekunder, hvilket er lidt over 136 år. Denne værdi er typisk underskrevet, hvilket betyder at den kan være negativ eller positiv. Så det repræsenterer normalt 68 år på begge sider af epoken, dvs. 1902-2038.

Dette er selvfølgelig stadig en begrænset periode. Men den primære anvendelse af tidsstempelformatet var til begreber som filændring. Behovet var i høj grad at repræsentere tid tæt på nutiden snarere end gammel historie eller langt ind i fremtiden. Selv for applikationer som f.eks. Kalendere er der sjældent behov for at repræsentere datoer mere end et par årtier ind i fremtiden.

Men det betyder ikke, at denne begrænsede tidsperiode er uden problemer...

Årets 2038-problem

Y2K-bugten (en af ​​de værste programmeringsfejl i historien) påvirkede computersystemer, der lagrede år som tocifrede værdier. Da året 2000 kom, behandlede sådanne systemer det som om det var 1900. I tilfælde af, var dette ikke så katastrofalt som frygtet, hovedsageligt fordi mange mennesker brugte meget tid og kræfter på forhånd på at forberede sig på det.

De 10 værste programmeringsfejl i historien

I sin store fortid kodede også ødelæggelse af smede. Forekomster af en lille smule dårlig kode forårsagede katastrofe på et stort niveau. Følgende er 10 af de værste programmeringsfejl i historien.

Hvis du var opmærksom i det forrige afsnit, har du muligvis set et lignende problem, der kan påvirke Unix-tiden. Nå, Unix-tid har et eget dataproblem: Y2k38-problemet. (Det kaldes ofte et problem, ikke en fejl; måske er vi blevet mere optimistiske siden år 2000!) Når Unix-tiden bogstaveligt talt løber ud i 2038, vil systemer behandle nye datoer enten som 1902 eller 1970. Eller muligvis mislykkes de bare helt.

I det mindste rammer dette problem os ikke ved midnatsslag nytårsaften. Det sidste sekund af 32-bit Unix-tid falder den 19. marts. I sidste ende vil vi sandsynligvis opgradere de fleste systemer inden 2038, ellers vil de alligevel være forældede inden da.

Nogle nyttige ressourcer med tidsstempel

Det Epoch Converter webstedet er muligvis den mest omfattende tidsstempelkonverter til rådighed. Det begynder med at vise den aktuelle Unix-tid - i realtid - og tilføjer næsten alle tænkelige funktioner ovenpå. Dens vigtigste anvendelse er til konvertering mellem tidsstempler og læsbare datoer i begge retninger.

Dan's Tools er en enorm samling af nyttige webapps, hvoraf den ene er en tidsstempelkonverter. Det er mere grundlæggende, men har en meget ren præsentation og er nem at bruge.

Time.is præsenterer et andet, endnu mere minimalistisk look. Det viser tid i et antal formater, inklusive Unix-tid. Det inkluderer det aktuelle tidspunkt i dets sidetitel, hvilket er nyttigt.

På Linux og macOS er dato programmet er kerneværktøjet til håndtering af dato / tid, inklusive Unix-tidsstempler. Kaldes uden argumenter, returnerer den aktuelle dato / tid i et menneskeligt læsbart format:

$ dato
Ons 10. feb. 12:28:30 GMT 2021

Hvis du har brug for den aktuelle dato / tid i Unix-tid, skal du bruge +% s argument:

$ dato +% s
1612960114

Du kan konvertere fra en menneskelig læsbar dato til et tidsstempel ved hjælp af -d flag, hvis din version af dato understøtter det. De fleste Linux-versioner skal som standard:

$ date -d "2. januar 1970" +% s
82800

På macOS, dato er et andet program, der kræver et andet sæt flag:

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

Gå i den anden retning, kan du konvertere fra et Unix-tidsstempel ved hjælp af -r flag:

$ dato -r 1600000000
Søn 13 sep 2020 13:26:40 BST

Nogle andre programmer bruger % s format til at håndtere Unix-tid. For eksempel, hvis du vil vise ændringsdatoen for en fil i Unix-tid med Linux-version af ls, kan du bruge følgende:

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

Sådan bruges Unix Time i programmeringssprog

PHP har tid() funktion, der returnerer det aktuelle Unix-tidsstempel. Dens dato() funktion tager et tidsstempel som sit andet argument:

$ php -r 'ekkodato ("Y-m-d", tid ());'
2021-02-11

JavaScript nærmer sig tingene på en interessant måde. Den har en Dato. Nu () metode til at få antallet af millisekunder siden Unix-epoken. Selvfølgelig kan du dele dette med 1.000 og afrunde resultatet for at give den tilsvarende Unix-tid i sekunder:

> Math.floor (Date.now () / 1000)
1613083012

Forståelse af Unix Time

Unix time er et simpelt koncept, der vokser op mange steder. Når du først har forstået det, kan du måske finde det ret nyttigt, når du f.eks. Beregner tidsforskelle. Du kan også genkende, hvornår det kan være årsagen til visse fejl.

Begreber som epoken og tidsstemplerne er en vigtig del af at komme i gang med Linux. For at finde ud af mere om væsentlige ting som f.eks ls, se vores guide til grundlæggende Linux-kommandoer.

E-mail
9 grundlæggende kommandoer til at komme i gang med Linux

Vil du blive fortrolig med Linux? Start med disse grundlæggende Linux-kommandoer for at lære almindelige computeropgaver.

Relaterede emner
  • Uspecificeret
Om forfatteren
Bobby Jack (27 artikler offentliggjort)

Bobby er en teknologientusiast, der arbejdede som softwareudvikler i det meste af to årtier. Han brænder for spil, arbejder som Reviews Editor i Switch Player Magazine og er fordybet i alle aspekter af onlineudgivelse og webudvikling.

Mere fra Bobby Jack

Abonner på vores nyhedsbrev

Deltag i vores nyhedsbrev for tekniske tip, anmeldelser, gratis e-bøger og eksklusive tilbud!

Et trin mere !!!

Bekræft din e-mail-adresse i den e-mail, vi lige har sendt dig.

.