Lag Unix dates

Denne enheten gir tilgang til UNIX datorelaterte funksjoner og prosedyrer
bidragsyter: BRIAN STARK plakater (************************* ************************************************** ) (* UNIX DATE Versjon 1.01 *) (* Denne enheten gir tilgang til UNIX datorelaterte funksjoner og prosedyrer *) (* A UNIX dato er antall sekunder fra 1. januar 1970. Denne enheten *) (* kan brukes fritt . Hvis du modifisere kildekoden, vennligst ikke *) (* distribuere forbedringer. *) (* (C) 1991-1993 av Brian Stark. *) (* Dette er et programmerings utgivelse fra Digital Illusions *) (* FidoNet 1: 289 /27.2 + Columbia, MO - USA *) (* Revision History *) (* ----------------------------- ------------------------------------------ *) (* 06-13- 1 993 1,02 | Mindre kode opprydding *) (* 05-23-1993 1,01 | Lagt noen flere rutiner for bruk med syns BBS *) (* ?? - ?? - 1 991 1,00 | Første utgivelse *) (* ------- -------------------------------------------------- -------------- *) (********************************* ******************************************)
INTERFACE
bruker DOS,
Funksjon GetTimeZone: ShortInt; {Returnerer verdien fra miljøet variabel " TZ ". Hvis ikke funnet, er UTC antatt, og en verdi på null returneres} Funksjon IsLeapYear (Kilde: Word): Boolean; {Bestemmer om året er et skuddår eller ikke} Funksjon Norm2Unix (Y, M, D, H, Min, S: Word): LongInt; {Konverter en vanlig date til sin UNIX dato. Hvis miljøvariabelen " TZ " er definert, da inngangsparametrene antas å være i ** LOKAL TID **} Prosedyre Unix2Norm (Dato: LongInt; Var Y, M, D, H, Min, S: Word); {Konverter en UNIX dato til normal dato motstykke. Hvis miljøvariabelen " TZ " er definert, så produksjonen vil være i ** LOKAL TID **}
Funksjon TodayInUnix: LongInt; {Gets dagens dato, og kaller Norm2Unix} {følgende avkastning en streng og krever TechnoJock totSTR enhet. Funksjon Unix2Str (N: LongInt): String; } Const DaysPerMonth: Array [1..12] av ShortInt = (031,028,031,030,031,030,031,031,030,031,030,031); DaysPerYear: Array [1..12] av Integer = (031,059,090,120,151,181,212,243,273,304,334,365); DaysPerLeapYear: Array [1..12] av Integer = (031,060,091,121,152,182,213,244,274,305,335,366); SecsPerYear: LongInt = 31536000; SecsPerLeapYear: LongInt = 31622400; SecsPerDay: LongInt = 86400; SecsPerHour: Integer = 3600; SecsPerMinute: ShortInt = 60;
GJENNOMFØRING
Funksjon GetTimeZone: ShortInt; Var Miljø: String; Indeks: Integer; Begynn GetTimeZone: = 0; {Anta UTC} Miljø: = GetEnv ('TZ'); {Grab TZ string} For indeks: = 1 til lengde (Environment) Gjør Miljø [Indeks]: = upcase (Environment [Indeks]); (* MERK: Jeg har ennå å finne en oversikt over ISO fortegntidssone forkortelser Følgende er hentet fra Opus-CBCS dokumentasjonsfiler *..) Hvis Miljø = 'EST05' Så GetTimeZone: = -05; {USA EASTERN} Hvis Environment = 'EST05EDT' Så GetTimeZone: = -06; Hvis Environment = 'CST06' Så GetTimeZone: = -06; {USA CENTRAL} Hvis Environment = 'CST06CDT' Så GetTimeZone: = -07; Hvis Environment = 'MST07' Så GetTimeZone: = -07; {USA MOUNTAIN} Hvis Environment = 'MST07MDT' Så GetTimeZone: = -08; Hvis Environment = 'PST08' Så GetTimeZone: = -08; Hvis Environment = 'PST08PDT' Så GetTimeZone: = -09; Hvis Environment = 'YST09' Så GetTimeZone: = -09; Hvis Environment = 'AST10' Så GetTimeZone: = -10; Hvis Environment = 'BST11' Så GetTimeZone: = -11; Hvis Environment = 'CET-1' Så GetTimeZone: = 01; Hvis Environment = 'CET-01' Så GetTimeZone: = 01; Hvis Environment = 'EST-10' Så GetTimeZone: = 10; Hvis Environment = 'WST-8' Så GetTimeZone: = 08; {Perth, Western Austrailia} Hvis Environment = 'WST-08' Så GetTimeZone: = 08; Enden,
Function IsLeapYear (Kilde: Word): Boolean; Begynn (* NB: Dette er feil *!) Hvis (Kilde Mod 4 = 0) Så IsLeapYear: = True Else IsLeapYear: = False; Enden,
Function Norm2Unix (Y, M, D, H, Min, S: Word): LongInt; Var UnixDate: LongInt; Indeks: Word; Begynn UnixDate: = 0; {initial} Inc (UnixDate, S); {legge sekunder} Inc (UnixDate, (SecsPerMinute * Min)); {legge minutter} Inc (UnixDate, (SecsPerHour * H)); {legge timer} (********************************************* ****************************) (* Hvis UTC = 0, og lokal tid er -06 timer UTC, deretter *) ( * UTC: = UTC - (-06 * SecsPerHour) *) (* Husk at en negativ # minus en negativ # gir en positiv verdi *) (****************** ************************************************** *****) UnixDate: = UnixDate - (GetTimeZone * SecsPerHour); {UTC offset}
Hvis D > 1 Da {har en dag allerede passert?} Inc (UnixDate, (SecsPerDay * (D-1)));
Hvis IsLeapYear (Y) Så DaysPerMonth [02]: = 29 Else DaysPerMonth [02]: = 28; {Kontroller for 29 februar}
indeks: = 1; Hvis M > 1 Da For indeks: = 1 til (M-1) Do {? Har en måned allerede passert} Inc (UnixDate, (DaysPerMonth [Indeks] * SecsPerDay));
Mens Y > 1970 Må begynner Hvis IsLeapYear ((Y-1)) Deretter Inc (UnixDate, SecsPerLeapYear) Else Inc (UnixDate, SecsPerYear); Des (Y, 1); Enden,
Norm2Unix: = UnixDate; Enden,
Prosedyre Unix2Norm (Dato: LongInt; Var Y, M, D, H, Min, S: Word); {} Var LOCALDATE: LongInt; Ferdig: Boolean; X: ShortInt; TotDays: integer; Begynn Y: = 1970; M: = 1; D: = 1; H: = 0; Min: = 0; S: = 0; LOCALDATE: = Dato + (GetTimeZone * SecsPerHour); {Lokal tid date} (******************************************** *****************************) (* Sweep hele år ... *) (******** ************************************************** ***************) Ferdig: = False; Mens Not Done Do begynner Hvis LOCALDATE > = SecsPerYear deretter begynne Inc (Y, 1); Des (LOCALDATE, SecsPerYear); Avslutt Else Ferdig: = true;
Hvis (IsLeapYear (Y + 1)) og (LOCALDATE > = SecsPerLeapYear) Og (Not Done), og start Inc (Y, 1); Des (LOCALDATE, SecsPerLeapYear); Ende; Ende; (************************************************* ************************) M: = 1; D: = 1; Ferdig: = False; TotDays: = LOCALDATE Div SecsPerDay; Hvis IsLeapYear (Y) Så Begynn DaysPerMonth [02]: = 29; X: = 1; Gjenta Hvis (TotDays < = DaysPerLeapYear [x]) Så Begynn M: = X; Ferdig: = true; Des (LOCALDATE, (TotDays * SecsPerDay)); D: = DaysPerMonth [M] - (DaysPerLeapYear [M] -TotDays) + 1; Slutt Else Ferdig: = False; Inc (X); Inntil (Ferdig) eller (X > 12); Avslutt Else Begynn DaysPerMonth [02]: = 28; X: = 1; Gjenta Hvis (TotDays < = DaysPerYear [x]) Så Begynn M: = X; Ferdig: = true; Des (LOCALDATE, (TotDays * SecsPerDay)); D: = DaysPerMonth [M] - (DaysPerYear [M] -TotDays) + 1; Slutt Else Ferdig: = False; Inc (X); Inntil Ferdig = Sant eller (X > 12); Ende; H: = LOCALDATE Div SecsPerHour; Des (LOCALDATE, (H * SecsPerHour)); Min: = LOCALDATE Div SecsPerMinute; Des (LOCALDATE, (Min * SecsPerMinute)); S: = LOCALDATE; Enden,
Function TodayInUnix: LongInt; Var År, Måned, Dag, dayOfWeek: Word; Time, minutt, sekund, Sec100: Word; Begynn getdate (år, måned, dag, dayOfWeek); GetTime (time, minutt, sekund, Sec100); TodayInUnix: = Norm2Unix (år, måned, dag, time, minutt, sekund); Enden,
Function Unix2Str (N: LongInt): String; Var År, Måned, Dag, dayOfWeek: Word; Time, minutt, sekund, Sec100: Word; T: String; Begynn Unix2Norm (N, år, måned, dag, time, minutt, sekund); T: = PadRight (IntToStr (måned), 2, '0') + '-' + PadRight (IntToStr (Dag), 2, '0') + '-' + PadRight (IntToStr (år), 2, '0 ') +' '+ PadRight (IntToStr (Time), 2,' 0 ') +': '+ PadRight (IntToStr (Minute), 2,' 0 ') +': '+ PadRight (IntToStr (Second), 2 , '0'); Hvis Hour > 12 Da T: = T + 'PM' Else T: = T + 'AM'; Unix2Str: = T; Enden,
END
.



Previous:
Next Page: