Contributor: DOUG LURIE

{
(* Here is the code snippet I want to donate to SWAG. It works both in TP
and in Delphi.
The date is incremented correctly for all leap years, and I have not
been able to
find any bugs, but there are no guarantees :-). *)
}

function IncrementDate( ADate : STRING ) : STRING;
(* ADate must take the form of mm/dd/yyyy *)
(* The common mm/dd/yy form will not work!*)

var
LeapYear             : BOOLEAN;

ecode,                               (* an error code (not used here) *)
dd, mm, yy           : INTEGER;

AString, DateString  : STRING;

begin
(* Crude error trap *)
if Length( AString ) <> 10 then
Halt( 1 );
if Copy( AString, 3, 1 ) <> '/' then
Halt( 1 );
if Copy( AString, 6, 1 ) <> '/' then
Halt( 1 );

(* Break ADate into its components *)
AString := Copy( ADate, 1, 2 );
Val( AString, mm, ecode );
AString := Copy( ADate, 4, 2 );
Val( AString, dd, ecode );
AString := Copy( ADate, 7, 4 );
Val( AString, yy, ecode );

LeapYear := False;
if yy mod 400 = 0 then        (* this is why the year must be "yyyy" *)
LeapYear := True
else if( yy mod 4 = 0 ) and ( yy mod 100 <> 0 ) then
LeapYear := True;

(* Increment date and adjust month and year as necessary *)
case mm of
1, 3, 5, 7, 8, 10 :
if dd < 31 then
Inc( dd )
else
begin
dd := 1;
Inc( mm );
end;
2 :
case dd of
1..27 :
Inc( dd );
28 :
if LeapYear = False then
begin
dd := 1;
mm := 3;
end
else
Inc( dd );
29 :
begin
dd := 1;
mm := 3;
end;
end;(*case*)
4, 6, 9, 11 :
if dd < 30 then
Inc( dd )
else
begin
dd := 1;
Inc( mm );
end;
12 :
begin
if dd < 31 then
Inc( dd )
else
begin
dd := 1;
mm := 1;
Inc( yy );
end;
end;
end;(*case*)

(* Add month to DateString *)
Str( mm, AString );
if Length( AString ) < 2 then
DateString := '0'+AString+'/'
else
DateString := AString+'/';
(* Add day to DateString *)
Str( dd, AString );
if Length( AString ) < 2 then
DateString := DateString+'0'+AString+'/'
else
DateString := DateString+AString+'/';
(* Add year to DateString *)
Str( yy, AString );
DateString := DateString+AString;

IncrementDate := DateString;
end;
