Delphi » FAQ

Jak obliczyć różnicę dat [ilość dni, miesięcy, lat]

Adam Boduch

A wiec oto rozwiazanie:

var
OldDate, Date: TDateTime;
wYear, wYear2, wMonth, wMonth2, wDay, wDay2 : Word;
fYear, fMonth, fDay : Word;
begin
OldDate := Now; // pobieranie dziesiejszej daty
DecodeDate(OldDate, wYear, wMonth, wDay);

Date := StrToDate('01-10-10');
DecodeDate(Date, wYear2, wMonth2, wDay2);

fYear := wYear - wYear2;
fMonth := wMonth - wMonth2;
fDay := wDay - wDay2;
ShowMessage(Format('Różnica dni: %d, miesięcy: %d, lat: %d',
[fDay, fMonth, fYear]));

Innym sposobem (w nowszych wersjach Delphi) jest użycie funkcji:
DaysBeetween, WeeksBeetween, MonthsBeetween, YearsBeetween i jeszcze wielu innych znajdujących się w module DateUtils. [Dryobates]
fYear := YearsBeetween(wYear, wYear2);

FAQ

5 komentarzy

Błędny sposób !!!
Aż dziwne, że nikt wcześniej tego nie zauważył...

Załóżmy, że jest 12 stycznia 2003, a datą którą odejmiemy jest 6 grudnia 1983.

Wynikiem zwróconym przez podaną wyżej procedurę będzie:
UWAGA NA ZNAKI !!!

"Różnica dni: 6 dni, miesięcy: -11 miesięcy, lat: 20 lat"...

Bez sensu!!!

Różnica dni i lat dodatnia, a miesięcy ujemna !!!

PROBLEM WYDAJE SIE BANALNY,
A JEDNAK...

Trzeba sobie zdefiniowac funkcje min() lub max() dla daty i od późniejszej odjąć wcześniejszą. Wszystko będzie wtedy oki. (Ale na to chyba każdy sam może wpaść).

Tak Flabra każdy...

Z tego, co pamiętam, to najpierw trzeba obliczyć ilość dni w roku, potem (dla uzupełnienia) ilość dni w miesiącu (uwzględniając lata przestępne, tzn.:

if (rok mod 100=0) and (rok mod 400<>0) then
iloscdni:=29
else
if (rok mod 4=0) then
iloscdni:=29
else
iloscdni:=28

co do lutego, jak i obliczania ilosci dni w roku).

Ja robiłem coś takiego jakieś 3 lata temu, męczyłem się straszliwie aby uzyskać poprawne wyniki ale udało się.
Nie będe wklejał kodu bo wygląda strasznie. Jak każda z moich wypoconych producji.