DEFINITION MODULE DateOperations;

(* Date and calendar procedures *)
(* J. Andrea, Aug.16/92 *)
(* Date calculations, dates valid only for 1-jan-1901 to 31-dec-2099 *)

EXPORT QUALIFIED Date,
                 Today,
                 StringToDate, DateToString, MakeDate,
                 LeapYear,
                 DayOfYear, DayOfWeek,
                 DaysBetween, AddDays, SubtractDays, Compare,
                 PhaseOfMoon;
                 
TYPE
   Date = RECORD
            day, month, year :CARDINAL;
            number :INTEGER;
            true   :BOOLEAN;
          END;
   
   PROCEDURE Today( VAR date :Date );
   (* return the current time as a date *)
   
   PROCEDURE StringToDate( string :ARRAY OF CHAR; VAR date :Date );
   PROCEDURE DateToString( date :Date; VAR string :ARRAY OF CHAR );
   (* Convert to and from strings in VMS format dd-mmm-yyyy *)
   
   PROCEDURE MakeDate( day, month, year :CARDINAL; VAR date :Date );
   (* create a date from only numeric info *)
   
   PROCEDURE LeapYear( year :CARDINAL ) :BOOLEAN;
   (* is the given year a leap year *)
                       
   PROCEDURE DayOfYear( date :Date ) :CARDINAL;
   (* return the day of the year 1 to 365 (or 366) *)
   (* a zero is returned for invalid dates *)

   PROCEDURE DayOfWeek( date :Date; VAR name :ARRAY OF CHAR );
   (* return the day of the week, Sunday, Monday, etc. *)
   (* an empty string is returned for invalid dates *)
   
   PROCEDURE DaysBetween( date1, date2 :Date ) :INTEGER;
   (* return the number of days between the two given days *)
   
   PROCEDURE AddDays( in_date :Date; days :CARDINAL; VAR out_date :Date );
   (* add the specified number of days to the given date *)
   
   PROCEDURE SubtractDays( in_date :Date; days :CARDINAL; VAR out_date :Date );
   (* subtract the specified number of days from the given date *)
                          
   PROCEDURE Compare( date1, date2 :Date ) :CHAR;
   (* return one of "=", ">", "<", or null (if one date is invalid) *)

   PROCEDURE PhaseOfMoon( date :Date; VAR phase :ARRAY OF CHAR );
   (* return the phase of the moon as a string *)
   (* an empty string is returned for invalid dates *)

END DateOperations.
