(Gast)
n/a Beiträge
|
Re: problem bei "selbstgerschriebenem" decodedate.
13. Mai 2005, 12:44
mitdach,
so jetzt versuch ich einfach nochmal:
also ich hab aus der unit sysutils die folgende funktion rauskopiert und etwas verändert; dabei ermittelt sie aus dem datum "date" vom typ integer den tag, monat und das jahr:
Delphi-Quellcode:
//ein paar definitionen...
type
PDayTable = ^TDayTable;
TDayTable = array[1..12] of Word;
const
MonthDays: array [Boolean] of TDayTable =
((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
//diese funktion überprüft, ob das jahr "year" ein schaltjahr ist
function IsLeapYear(Year: Word): Boolean;
begin
Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
//diese prozedur berechnet aus dem datum "date" das jahr, den monat und den tag
procedure DecodeDate(date: Integer; var Year, Month, Day: Word);
const
D1 = 365;
D4 = D1 * 4 + 1;
D100 = D4 * 25 - 1;
D400 = D100 * 4 + 1;
var
Y, M, D, I: Word;
DayTable: PDayTable;
begin
try
if date <= 0 then
begin
Year := 0;
Month := 0;
Day := 0;
end
else
begin
Dec(date);
Y := 1;
while date >= D400 do
begin
Dec(date, D400);
Inc(Y, 400);
end;
DivMod(date, D100, I, D);
if I = 4 then
begin
Dec(I);
Inc(D, D100);
end;
Inc(Y, I * 100);
DivMod(D, D4, I, D);
Inc(Y, I * 4);
DivMod(D, D1, I, D);
if I = 4 then
begin
Dec(I);
Inc(D, D1);
end;
Inc(Y, I);
DayTable := @MonthDays[IsLeapYear(Y)];
M := 1;
while True do
begin
I := DayTable^[M];
if D < I then
Break;
Dec(D, I);
Inc(M);
end;
Year := Y;
Month := M;
Day := D + 1;
end;
except
raise conv.Create(' Fehler beim decodieren eines Datumswertes!' + #10 +
' Wenden Sie sich bitte an den Hersteller...');
end;
showmessage(inttostr(date));
end;
um das datum dann als string anzuzeigen verwende ich momentan folgende funktion:
Delphi-Quellcode:
function DateToStr(date: Integer): string;
var
a, b, c: Word;
begin
DecodeDate(date, a, b, c);
result := IntToStr(c) + '.' + IntToStr(b) + '.' + IntToStr(a);
// result := IntToStr(ExtractDay(date)) + '.' + IntToStr(ExtractMonth(date)) +
// '.' + IntToStr(ExtractYear(date));
end;
soweit so gut, nur gibt die funktion föllig falsche werte aus! hab schon alles verglichen und ausprobiert, aber jetzt weiss ich nicht mehr weiter.
warum bekomme ich mit decodedate also so falsche werte?!?
mfg,
heiopei
|