[Lazarus] DateDif function needed

waldo kitty wkitty42 at windstream.net
Sat Nov 9 18:42:07 CET 2013


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.




More information about the Lazarus mailing list