Intern Time
Internt opprettholder et Unix-system tid som antall sekunder siden Unix Epoch. Unix Epoch ble ved midnatt 1 januar 1970 UTC. I den østlige tidssone i USA som var den 31 desember 1969 kl 19:00. Som jeg starte denne artikkelen, er tiden 1171733878. Jeg bruker NTP (Network Time Protocol) for å holde datamaskinen min klokke synkronisert. Så på eksakt øyeblikk at datamaskinen min syntes det var 1171733878, sannsynligvis det gjorde ditt. Enhver computer burde være enige om hva klokken er. Det spiller ingen rolle i hvilken tidssone datamaskinen bor eller i hvilken tidssone du bor. Hvis jeg hadde skrevet til en fil i løpet av den andre, ville Unix har registrert endringstid som 1171733878.
Unix tiden var tradisjonelt et signert 32-bits heltall. Det betyr at maksimal tid er 2147483647, som ville i Eastern TimeZone av USA være 18 januar 2038 kl 22:14:07. Planen er at dette utvides til et 64 bits heltall før da. Unix sekunder teller frem én etter én. Etter 1171733878, neste sekund som meg system vil vite om er 1171733879. Når den er syncronized arbeider NTP ved å forkorte eller forlenge et sekund. Jeg kan få tak i tid ved å ringe systemet samtaletid (). Hvis jeg vil ha noe bedre enn sekunder, er det neste mest nøyaktige grensesnitt systemet kaller ganger (). ganger () Hovedformålet er å få en struktur av data om systemet behandling. Men returkoden er også nyttig ... Det er den tiden i døgnet flått. Clock ticks starter på et vilkårlig tidspunkt i fortiden (ofte oppstart), og de forhånd når kjernen klokken rutinen kjøres. Hvor mange clock ticks per sekund kan variere. Du kan ringe sysconf (_SC_CLK_TCK) for å finne ut din verdi. 100 er vanlig verdi i disse dager. Eldre systemer brukes 60. 100 og 60 er de eneste to verdiene jeg har sett. Klokke flått er også tilbake som en signert heltall. Så etter omtrent et år, vil antallet rulle tilbake til null. Annet enn rollover, flått klokke også forhånd én etter én. (Clock flått kalles ofte «jiffies" av Linux-folk.) Det er også et annet system samtale gettimeofday () som returnerer gang siden Unix Epoch i sekunder og mikrosekunder. gettimeofday () kreves for å eksistere og å bruke mikrosekund presisjon. Men nøyaktigheten er eksplisitt uspesifisert. Det mikrosekunder ikke forhånd ett etter ett i ethvert system som jeg har sett. Jeg antar at Unix-systemer er ganske god med hundredeler av et sekund og kanskje millisekunder er noen tilfeller. Men jeg ville ikke påta seg noe nøyaktighet enn det.
Lesbar tidsstempler
Nå som vi vet hvordan Unix holder tid, la oss gå videre til et annet emne: Hvordan vise tid til en bruker. Få brukere vil være fornøyd med et tidsstempel som vises som 1171733878. Siden jeg i det østlige Timezone av USA, ønsker jeg å se noe lignende 12:37:58 den 17. Feb, 2007. Men en person i Los Angeles California ønsker noe sånt 9:37:58 den 17. Feb, 2007. Jeg skrev en liten
perl script for å vise formaterte tid da gitt et nummer som 1171733878. Her er resultatet slik det skal vises i både det østlige og Stillehavet tidssoner for et par nøye utvalgte tidsstempler:
Øst:
1173596399 Søn 2007-03-11 01:59:59 Standard Time
1173596400 Søn 2007-03-11 03:00:00 Sommertid
1173607199 Søn 2007-03-11 05:59:59 Sommertid
1173607200 Søn 2007-03-11 06:00:00 Sommertid
Stillehavet:
1173596399 Lør 2007-03-10 22:59:59 Standard Time
1173596400 Lør 2007-03-10 23:00:00 Standard Time
1173607199 Søn 2007-03-11 01:59:59 Standard Time
1173607200 Søn 2007-03-11 03:00:00 Sommertid
Legg merke til at den interne Unix tiden ikke endres med utbruddet av sommertid. Hva som skjer er at en ny regel for hvordan du kan vise tiden trer i kraft. For å konvertere intern tid til et tidsstempel, må Unix å vite hvilken tidssone du vil bruke. Og det trenger å vite om Sommertid er i bruk. Det finnes forskjellige delrutinene som kan kalles å formatere et tidsstempel. Alle disse eventuelt påberope tzset () for å bestemme tidssonen og staten Sommertid. Og tzset alltid ser etter miljøvariabelen TZ å finne ut hva brukeren ønsker. Hvis du ikke en TZ environment variable, tzset () vil gå med en slags standard som kan variere fra system til system. The TZ environment variable er ofte satt til noe som EST5EDT4 som er det jeg bruker. Denne sier at jeg er i en tidssone som kalles EST som er forskjøvet fra Universal Time etter 5 timer og under Sommertid dager tidssone kalles EDT som er forskjøvet fra Universal Time etter 4 timer. Å vite når Sommertid er i bruk, vil tzset se på noen datafilen. Hvilken fil (og hvilket format filen er) varierer fra system til system. Oppdateringene som er tilgjengelig for årets endring i sommertid skulle egentlig være litt mer enn enkelte revisjoner til disse filene.
Universal Time
I tillegg til å vite om din tidssone, et Unix-system må kunne bruke Universal Time (som er nesten det samme som den gamle Greenwich Mean Time). Dette er hva "date-u" gjør. Definisjonen for Universal Time er godt kjent og ikke involverer sommertid endringer. Universal Time definisjonen kan bygge inn datoen rutiner istedenfor å bruke datafilen for tzset (). Dette kan være sant selv om en oppføring er tilstede for UTC. Postprogrammer bruker ofte UTC tidsstempler.