digging deeper to work directly with YearsBetween and MonthsBetween shows that they seem to be missing the usual "+0.5" generally used to ensure that rounding is properly handled...

the following two pairs of routines work to give the desired output...

*this pair uses Trunc((X)+.05) instead of the original Trunc(X)*

Function YearsBetween(const ANow, AThen: TDateTime): Integer;
begin

Result:=Trunc(((Abs(MyDateTimeDiff(ANow,AThen))+TDateTimeEpsilon)/ApproxDaysPerYear)+0.5);
end;

Function MonthsBetween(const ANow, AThen: TDateTime): Integer;
begin

Result:=Trunc(((Abs(MyDateTimeDiff(ANow,AThen))+TDateTimeEpsilon)/ApproxDaysPerMonth)+0.5);
end;

note the additional '(' after 'Trunc' and the closing '+0.5)' which handles the rounding as compared to the original routines in DateUtil.inc...


*OR this pair using Round() instead of the original Trunc(X) or the above Trunc((X)+0.5)*


Function YearsBetween(const ANow, AThen: TDateTime): Integer;
begin

Result:=Round((Abs(MyDateTimeDiff(ANow,AThen))+TDateTimeEpsilon)/ApproxDaysPerYear);
end;

Function MonthsBetween(const ANow, AThen: TDateTime): Integer;
begin

Result:=Round((Abs(MyDateTimeDiff(ANow,AThen))+TDateTimeEpsilon)/ApproxDaysPerMonth);
end;


i don't know which would be better to use in this case but one should be applied to the existing routines in DateUtil.inc to fix the error in them ;)

--
NOTE: No off-list assistance is given without prior approval.
      Please keep mailing list traffic on the list unless
      private contact is specifically requested and granted.

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to