Intern Time
Internt har ett Unix-system gången som antalet sekunder sedan Unix Epoch. Unix Epoch var vid midnatt 1 januari 1970 UTC. I östra Tidszon i USA som var 31 december 1969 klockan 19:00. Som jag startar den här artikeln, är det dags 1171733878. Jag använder NTP (Network Time Protocol) för att hålla min datorns klocka i synk. Så vid det exakta ögonblick att min dator tyckte det var 1171733878, förmodligen så gjorde ditt. Varje programsystem bör överens om vad klockan är. Det spelar ingen roll i vilken tidszon din dator är bosatt eller i vilken tidszon du bor. Om jag hade skrivit till en fil under den andra, skulle Unix har spelat in de modifiering tid som 1171733878.
Unix tid var traditionellt en signerad 32 bitars heltal. Det innebär att maximal tid är 2147483647 vilket i östra TimeZone av USA ha Januari 18, 2038 at 22:14:07. Planen är att detta skall expandera till ett 64 bitars heltal innan dess. Unix sekunder räkna fram en i taget. Efter 1171733878, nästa sekund att mitt system kommer att känna är 1171733879. När det är syncronized, verk NTP genom att förkorta eller förlänga en sekund. Jag kan få den tid genom att ringa när systemanrop (). Om jag vill ha något bättre än sekunder, är den näst mest exakta gränssnitt systemet samtalet gånger (). gånger () huvudsyfte är att få en struktur av uppgifter för systemet användning. Men returkod är också bra ... är tiden i klockan fästingar. Klockan fästingar börjar på en godtycklig punkt i det förflutna (ofta uppstart) och de framsteg när kärnan klockan rutinen körs. Hur många klocka fästingar per sekund kan variera. Du kan ringa sysconf (_SC_CLK_TCK) för att ta reda på ditt värde. 100 är vanligt värde dessa dagar. Äldre system används 60. 100 och 60 är de enda två värden jag har sett. Klocka fästingar är också tillbaka som en undertecknad heltal. Så efter ungefär ett år, kommer antalet rulla tillbaka till noll. Än rollover, fästingar klocka även förhand en i taget. (Clock fästingarna ofta kallas "jiffies" av Linux folk.) Det finns också ett annat system samtal, gettimeofday () som returnerar gången sedan Unix Epoch i sekunder och mikrosekunder. gettimeofday () krävs att existera och att använda mikrosekund precision. Men noggrannheten uttryckligen ospecificerad. Den microseconds överför inte en i taget i alla system som jag har sett. Jag antar att Unix-system är ganska bra med hundradels en andra och kanske millisekunder är en del fall. Men jag skulle inte ta någon noggrannhet än så.
Läsbara tidsstämplar
Nu när vi vet hur Unix håller tiden, låt oss gå vidare till en annan fråga: Hur vill visa tid till en användare. Få användare kommer att vara nöjd med en tidsstämpel som visas som 1171733878. Eftersom jag i östra Tidszon i USA, skulle jag vilja se något liknande 12:37:58 den 17 februari 2007. Men en person i Los Angeles Kalifornien vill ha något liknande 9:37:58 den 17 februari 2007. Jag skrev lite
perl skript för att visa formaterade tid vid ett antal lik 1171733878. Här är det utgång som det ska visas i både östra och Stillahavsområdet tidszoner ett fåtal noga utvalda tidsstämplar:
Eastern:
1173596399 Sun 2007-03-11 01:59:59 Standard Time
1173596400 Sun 2007-03-11 03:00:00 sommartiden
1173607199 Sun 2007-03-11 05:59:59 sommartiden
1173607200 Sun 2007-03-11 06:00:00 sommartiden
Pacific:
1173596399 Lör 2007-03-10 22:59:59 Standard Time
1173596400 Lör 2007-03-10 23:00:00 Standard Time
1173607199 Sun 2007-03-11 01:59:59 Standard Time
1173607200 Sun 2007-03-11 03:00:00 sommartiden
Observera att den inre Unix tid inte ändras i och med uppkomsten av sommartid. Vad som händer är att en ny regel för hur man ska visa tiden träder i kraft. För att omvandla inre tid till en tidsstämpel behöver Unix veta vilken tidszon som ska användas. Och det behöver veta om sommartid är i kraft. Det finns olika subrutiner som kan kallas för att formatera en tidsstämpel. Alla dessa eventuellt åberopa tzset () för att fastställa tidszonen och läget i sommartid. Och tzset alltid kontroller för miljövariabeln TZ ta reda på vad användaren vill. Om du inte ett TZ miljövariabel, tzset () kommer att gå med någon sorts standard som kan variera från system till system. Den TZ miljövariabel är ofta inställt på något liknande EST5EDT4 vilket är vad jag använder. Detta säger att jag är i en tidszon som kallas EST som har kompenserats från Universal Time av 5 timmar och under sommartid dagar min tidszon kallas EDT som har kompenserats från Universal Time av 4 timmar. Att veta när sommartid är i kraft, kommer tzset titta i några dataregister. Vilken fil (och vilket format filen är i) varierar från system till system. De patchar som är tillgängliga för årets förändring av sommartid borde egentligen vara lite mer än vissa revideringar av dessa filer.
Universal Time
Förutom kunskap om din tidszon, ett Unix-system måste kunna använda Universal Time (vilket är nästan samma som den gamla Greenwich Mean Time). Detta är vad "date-u" gör. Definitionen för Universal Time är väl känt och inte innebär sommartid förändringar. The Universal Time definition kan byggas in datumet rutiner snarare än att använda den datafil för tzset (). Detta kan vara fallet även om en post finns på UTC. Postprogram använder ofta UTC tidsstämplar.