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 *)
   AString := ADate;
   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;