22. april 2009 - 19:36
Der er
5 kommentarer og
1 løsning
Unix tid
Hej
har dette stykke kode til at omdanne til unix tid.. men den er 3600 sekunder bagud...
Hvordan for jeg den til at tage højde for sommer/vinter tid? den tids zone der er sat på PCen
function DateTimeToUnix(Value: TDateTime): LongWord;
var Year: Word;
Month: Word;
Day: Word;
Hour: Word;
Min: Word;
Sec: Word;
MSec: Word;
x: extended;
y: extended;
TimeZone: TTimeZoneInformation;
TheZone: float;
begin
DecodeDate(Value, Year, Month, Day);
DecodeTime(Value, Hour, Min, Sec, MSec);
GetTimeZoneInformation(TimeZone);
TheZone := TimeZone.Bias div -60;
x := (EncodeDate(Year, Month, Day) - EncodeDate(1970, 1, 1)) * 86400 ;
y := (Hour*3600) + (Min*60) + Sec;
x := x+y-(TheZone*3600);
result := StrToInt( FloatToStr(x) );
end;
24. april 2009 - 04:21
#2
Forsimplet version som virker:
function D2U(Value: TDateTime): LongWord;
var
tz : TTimeZoneInformation;
res : LongWord;
begin
res := trunc((value - StrToDateTime('01-01-1970 00:00:00')) * 24 * 60 * 60);
if GetTimeZoneInformation(tz) = TIME_ZONE_ID_DAYLIGHT then begin
res := res + (tz.DaylightBias + tz.Bias) * 60
end else begin
res := res + (tz.StandardBias + tz.Bias) * 60;
end;
D2U := res;
end;
24. april 2009 - 04:21
#3
Demo:
program unixtime;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
function time(t : pointer) : integer; cdecl; external 'msvcrt.dll';
function D2U(Value: TDateTime): LongWord;
var
tz : TTimeZoneInformation;
res : LongWord;
begin
res := trunc((value - StrToDateTime('01-01-1970 00:00:00')) * 24 * 60 * 60);
if GetTimeZoneInformation(tz) = TIME_ZONE_ID_DAYLIGHT then begin
res := res + (tz.DaylightBias + tz.Bias) * 60
end else begin
res := res + (tz.StandardBias + tz.Bias) * 60;
end;
D2U := res;
end;
var
t : TDateTime;
begin
writeln(D2U(now));
writeln(time(nil));
readln;
end.
24. april 2009 - 15:23
#4
Og for en god ordens skyld:
- koden antager at den testede data har samme sommer/vinter tids status som nu
- hvis den betingelse skal opfyldes skal man lave et mere avanceret test
- der er *umuligt* at lave et perfekt test da man i den time hvor uret stilles tilbage vil have *en* lokal tid som svarer til *to* forskellike unix tid