Varför har Unix sitt eget tidsbegrepp? Vad är epoken och vad är Y2038-problemet?
Unix-tid är ett sätt att representera ett visst datum och tid, som används av Linux, macOS och många andra interoperabla system. Det är så utbrett att du förmodligen använder det utan att vara medveten om det. Men när du förstår Unix-tiden kommer du att upptäcka den i många sammanhang. Flera verktyg kan hjälpa dig att arbeta med Unix-tid.
Vad är syftet med Unix Time?
Unix-tid räknas som totalt antal sekunder sedan en fast tid och ett datum. Det är ett datum / tid (eller tidsstämpel) format som ser annorlunda ut än de mänskliga läsbara datum och tider vi är vana vid. Detta är enbart av effektivitetsskäl. Det tar mycket mindre utrymme att lagra ett enda nummer som representerar sekunder än att spara separata värden för året, månaden, timmen etc.
I moderna termer är naturligtvis rymdskillnaden inte så mycket alls. Men tänk på att Unix har sitt ursprung i slutet av 1960-talet när lagringsutrymmet var mycket mindre. Tidsstämplar används också mycket, så deras lagring ökar. Till exempel har varje fil tre tidsstämplar associerade.
Formatet är ganska omöjligt att översätta i ditt huvud om du inte är ett matematiskt geni. Men det har fortfarande några fördelar jämfört med mer läsbara alternativ som Ons 21 oktober 2015 07:28:00 GMT. Du kan enkelt beställa två Unix-tidsstämplar. Det är vanligtvis också snabbare att räkna ut skillnaden mellan två tidsstämplar. Detta gäller särskilt datum nära varandra, till exempel närliggande dagar.
Om epoken
Så Unix-tid är totalt antal sekunder sedan en viss tidpunkt. Men vad är den tidpunkten? Dess 00:00:00 UTC på 1 januari 1970. Detta kallas ofta Unix Epoch. Programmerare valde detta datum för epoken av bekvämlighet eftersom det var det närmaste runda datumet när de uppfann Unix-tiden.
Du kanske har sett det här datumet när något har gått fel. Det är helt klart en bugg, men en som ser väldigt konstig ut när den resulterar i ett datum från den tidpunkt då många av oss föddes! Det är dock helt förståeligt när du vet om Unix-tid. Om något system försöker visa en tidsstämpel som inte har något värde, översätts det ofta till 0 och resulterar i det exakta datumet.
Unix tidsdataformat
Strikt taget finns det ingen. Den ursprungliga datatypen var ett 32-bitars heltal, och detta förblir ofta fallet, även i mycket kraftfullare system.
Denna datatyp gör att värdet kan lagras totalt 2 ^ 32 sekunder, vilket är drygt 136 år. Detta värde undertecknas vanligtvis, vilket betyder att det kan vara negativt eller positivt. Så det representerar vanligtvis 68 år på vardera sidan av epoken, dvs. 1902-2038.
Det här är naturligtvis fortfarande en begränsad period. Men den primära användningen av tidsstämpelformatet var för begrepp som filändring. Behovet var mycket att representera tid nära nutiden snarare än forntida historia eller långt in i framtiden. Även för applikationer som kalendrar finns det sällan ett behov av att representera datum mer än några decennier in i framtiden.
Men det betyder inte att den begränsade tidsperioden är utan problem...
Årets 2038-problem
Y2K-buggen (ett av de värsta programmeringsfelen i historien) påverkade datorsystem som lagrade år som tvåsiffriga värden. När år 2000 kom omkring behandlade sådana system det som om det var 1900. I händelse av detta var detta inte så katastrofalt som man fruktade, främst för att många tillbringade mycket tid och ansträngning i förväg för att förbereda sig för det.
I sitt stora förflutna kodade också förstörelse. Förekomster av lite dålig kod orsakade katastrof på stor nivå. Följande är 10 av de värsta programmeringsfelen i historien.
Om du uppmärksammade i föregående avsnitt kanske du har upptäckt ett liknande problem som kan påverka Unix-tiden. Tja, Unix-tid har ett eget dataproblem: Y2k38-problemet. (Det kallas ofta ett problem, inte ett fel. kanske har vi blivit mer optimistiska sedan år 2000!) När Unix-tiden bokstavligen tar slut 2038 kommer system att behandla nya datum antingen 1902 eller 1970. Eller kanske misslyckas de helt och hållet.
Detta problem kommer åtminstone inte att drabbas av oss vid midnatt på nyårsafton. Den sista sekunden av 32-bitars Unix-tid faller den 19 mars. I slutändan kommer vi troligen att uppgradera de flesta system 2038, annars kommer de ändå vara föråldrade.
Några användbara tidsstämplingsresurser
De Epoch Converter webbplatsen är möjligen den mest omfattande tidsstämpelomvandlaren som finns tillgänglig. Det börjar med att visa den aktuella Unix-tiden - i realtid - och lägger till nästan alla tänkbara funktioner utöver det. Dess huvudsakliga användning är att konvertera mellan tidsstämplar och läsbara datum i båda riktningarna.
Dan's Tools är en enorm samling användbara webbappar, varav en är en tidsstämpelomvandlare. Det är mer grundläggande men har en mycket ren presentation och är lätt att använda.
Tiden är presenterar ett annat, ännu mer minimalistiskt utseende. Den visar tid i ett antal format, inklusive Unix-tid. Den innehåller aktuell tid i dess sidrubrik som är användbar.
På Linux och macOS, datum programmet är kärnverktyget för att hantera datum / tid, inklusive Unix-tidsstämplar. Anropas utan några argument, returnerar det aktuella datumet / tiden i ett läsbart format:
$ datum
Ons 10 feb 12:28:30 GMT 2021
Om du behöver aktuellt datum / tid i Unix-tid, använd +% s argument:
$ datum +% s
1612960114
Du kan konvertera från ett läsbart datum till en tidsstämpel med hjälp av -d flagga om din version av datum stöder det. De flesta Linux-versioner bör som standard:
$ date -d "2 jan 1970" +% s
82800
På macOS, datum är ett annat program som kräver en annan uppsättning flaggor:
$ date -j -f "% b% d% Y% T" "02 jan 1970 00:00:00" "+% s"
82800
Går du i den andra riktningen kan du konvertera från en Unix-tidsstämpel med hjälp av -r flagga:
$ datum -r 1600000000
Sön 13 sep 2020 13:26:40 BST
Vissa andra program använder % s format för att hantera Unix-tid. Till exempel om du vill visa modifieringsdatum för en fil under Unix-tiden, med Linux-version av ls, kan du använda följande:
$ ls -l --time-style = +% s index.tmp.html
-rw-r - r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html
Hur man använder Unix-tid i programmeringsspråk
PHP har tid() funktion som returnerar den aktuella Unix-tidsstämpeln. Dess datum() funktionen tar en tidsstämpel som sitt andra argument:
$ php -r 'ekodatum ("Y-m-d", tid ());'
2021-02-11
JavaScript närmar sig saker på ett intressant sätt. Den har en Datum. Nu () metod för att få antalet millisekunder sedan Unix-epoken. Naturligtvis kan du dela detta med 1000 och avrunda resultatet för att ge motsvarande Unix-tid i sekunder:
> Math.golv (Date.now () / 1000)
1613083012
Förstå Unix Time
Unix time är ett enkelt koncept som växer upp på många ställen. När du förstår det kanske du tycker att det är ganska användbart, till exempel när du beräknar tidsskillnader. Du kan också känna igen när det kan vara orsaken till vissa buggar.
Begrepp som epoken och tidsstämplar är en viktig del av att komma igång med Linux. För att ta reda på mer om väsentligheter som ls, kolla in vår guide till grundläggande Linux-kommandon.
Vill du bli bekant med Linux? Börja med dessa grundläggande Linux-kommandon för att lära dig vanliga datoruppgifter.
- Ospecificerad
Bobby är en teknikentusiast som arbetat som programutvecklare under mer än två decennier. Han brinner för spel, arbetar som Recensentredaktör på Switch Player Magazine och är nedsänkt i alla aspekter av onlinepublicering och webbutveckling.
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!
Ett steg till…!
Bekräfta din e-postadress i e-postmeddelandet som vi just skickade till dig.