# [Lazarus] DateDif function needed

John Landmesser JohnML at online.de
Sat Nov 9 14:01:47 CET 2013

```On 09.11.2013 06:55, leledumbo wrote:
>    Date1 := EncodeDate(2012,12,21);
>    Date2 := EncodeDate(2013,01,01);

Your code Result is: 1900 Years, 1 Month, 10 days and thats incorrect.

I thought about it some time and found a solution:

Think of the age of an employe! We have now() and his birthday.
How old is he in Years , Months and days?

my code:

uses DateUtils;

function TForm1.CalcDateDif(von, bis: TDateTime): String;
var
Year, Month, Day: longint;
YearVon, MonthVon, DayVon : word;
YearBis, MonthBis, DayBis : word;

begin

DecodeDate(von, YearVon, MonthVon, DayVon);
DecodeDate(bis, YearBis, MonthBis, DayBis);

// whole year:
year := YearsBetween(von,bis);

// How many months more than months in "year"
Month := MonthsBetween(von,bis) - (year * 12);

// Special case: December of previous year as "von"  and not a whole
Month until "bis": 21.12.2012 until 01.01.2013
if  (YearBis - YearVon = 1) and (MonthVon = 12) then
begin
Day :=  DaysBetween(von,EndOfAYear(YearVon)) + DayOfTheYear(bis);
end
else
Day := DaysBetween(EnCodeDate(YearBis,MonthVon, DayVon), bis) ;

Result := IntToStr(year) + ' Jahr(e) ';

Result := Result + IntToStr(Month) + ' Monat(e) ';

Result := Result + IntToStr(Day) + ' Tag(e) ';

end;

// I have to test that later again, but i think thats ok now?!!
// Going jogging now :-))

But i'm really wondering that Freepascal does not have such a function?!!

```