                           Date & Time Management

                                  "Poetic justice with her lifted scale;
                                   where, in nice balance, truth with
                                   gold she weighs, and solid pudding
                                   against empty praise."
                                                A Pope, The Duncied 1728

Introduction

          Date manipulation has always been a problem for computer
     programmers. If only there were ten days in a week, ten weeks in a
     year, and ten years in a century! Date mathematics is just plain
     clumsy when you think of dates in terms of days, months, and years.
     Try computing the date one hundred days after February 20, 1965!
     Not so easy.

          Date mathematics is greatly simplified when you convert dates
     into their Julian form. Over the centuries, many mathematicians
     have devised methods of accurately computing dates. Most modern
     computer systems (including this toolkit!) use the Julian system.
     The Julian period was devised in 1582 by Joseph Scaliger, and was
     named after his father Julian (not after the Julian calendar). The
     Julian system assigns each day its own sequential number. Day 1
     began at noon, January 1, 4713 BC. Every day since that time has
     its own sequential number, thus, February 11, 1991 is Julian period
     2448299.

          The GoldDate Unit provides a variety of functions for
     converting dates to and from Julian format. To compute the date one
     hundred days after February 20, 1956, you would convert the date to
     Julian, add one hundred to it, and convert it back to a string.
     This can be achieved with the following compound statement using
     toolkit functions.

          FancyDateStr(GregToJul(2,20,1956)+100,true,true);

          This uses the function GregToJul to convert Month, Day, and
     Year to a Julian period. A hundred is then added to it, and this
     value is passed to the function FancyDateStr, which returns a text
     string showing the date represented by the Julian period. In this
     example, the following date would be returned:

          Wednesday May 30, 1956

          Gold supports dates in eight different formats. Using M, D,
     and Y to represent months, days, and years respectively, the
     supported formats are:

          MMDDYY
          MMDDYYYY
          MMYY
          MMYYYY
          DDMMYY
          DDMMYYYY
          YYMMDD
          YYYYMMDD

          Many of the GoldStr functions need to know in which format the
     date strings are, and so the unit includes the enumerated type
     gDate, which (not surprisingly) has the following members: MMDDYY,
     MMDDYYYY, MMYY, MMYYYY, DDMMYY, DDMMYYYY, YYMMDD, and YYYYMMDD.

          If you plan to delve into ancient history with your date
     calculations, you need to be aware of some strange facts. For
     example, different countries decided to drop certain days to adjust
     for inaccuracies in the lunar calendar. In 1752, the British
     decreed that the following September 2nd would be September 14th.
     Further back in 1582, Pope Gregory XIII (of Gregorian calendar
     fame!) decreed that October 4th would become October 15th. In 1793
     the French ... well, you get the idea. For a good summary of these
     calendar aberrations, refer to any copy of The World Almanac and
     Book of Facts.

Date Methods

     The GoldDate Unit includes the following routines:

     Date:string;

          Returns the system date nicely formatted. The string appears
     as; the Day of Week and Month spelled out followed by the Day, and
     Year.

     GregtoJul(M,D,Y:longint):longint;

     Returns the Julian value (a longint) of a Gregorian date.

     JultoGreg(Jul:longint; var M,D: word; var Y:longint);

     Converts a Julian value to its Gregorian equivalent.

     Day(DStr:string;Format:gDate):word;

     Returns the day portion of a date string.

     Month(DStr:string;Format:gDate):word;

     Returns the month portion of a date string.

     Year(DStr:string;Format:gDate):word;

     Returns the year portion of a date string.

     StrtoJul(DStr:string;Format:gDate):longint;

     Converts a date string to its Julian equivalent.

     DOWNum(DStr:string;Format:gDate):byte;

          Returns a byte indicating the day of the week representative
     of a date string. 0 = Sunday, 1 = Monday, etc .....

     DOWStr(DayByte:byte): string;

          Returns the day of the week, in string form, represented by
     DayByte. 0 = Sunday, 1 = Monday, etc.....

     DOWJul(Jul:longint):byte;

          Returns a byte indicating the day of the week representing the
     Julian value specified. 0 = Sunday, 1 = Monday, etc .....

     GregtoStr(M,D,Y:longint;Format:gDate):string;

          Returns a date string representing the dates indicated by M,
     D, and Y in the form of the enumerated Format.

     JultoStr(Jul:longint;Format:gDate):string;

          Returns a date string in the specified format representing the
     Julian date indicated by Jul.

     TodayinJul:longint;

          Returns a longint value representing the system date in Julian
     form.

     ValidDate(M,D,Y:longint):boolean;

          Returns TRUE if the values passed actually equate to a true
     date. Each value is validated for proper month, day, and year,
     including leap years.

     ValidDateStr(DStr:string;Format:gDate):boolean;

          Returns TRUE if the date string actually equals a true date.
     Each value of the date string is validated for proper month, day,
     and year, including leap years.

     StripDateStr(DStr:string;Format:gDate):string;

     Returns a date string with the date separators removed.

     FancyDateStr(Jul:longint; Long,Day:boolean):string;

          Returns a nicely formatted string representing the indicated
     Julian value. The string is returned in the form of Day-of-week and
     Month spelled out followed by the day and year as numbers.

     RelativeDate(DStr:string;Format:gDate;Delta:longint):string;

          Returns a date string that has been adjusted by the number of
     days indicated by Delta. This may be a positive or negative number
     of days.

     RelativeDateYMD(DStr:string;Format:gDate; Y,M,D:longint):string;

          Returns a date string that has been adjusted by the number of
     years, months, and days. Each offsetting element has the ability to
     be positive or negative.

     StartOfYear(Jul:longint):longint;

          Returns the Julian value of January 1st in the year of the
     date passed.

     EndOfYear(Jul:longint):longint;

          Returns the Julian value of December 31st in the year of the
     date passed.

     DateFormat(Format:gDate):string;

          The date format that is passed must be a member of the
     enumerated type, gDate. If Format is valid, a string representation
     of the date format is returned, otherwise a null string will be
     returned.

     UnformattedDate(InDate:string):string;

     Strips all non-numeric characters.

Time Routines

          Even though the date routines are extremely powerful and offer
     the developer a great deal of flexibility, we thought that a
     complement of time routines was in order. They follow in much the
     same fashion, offering the same power and flexibility within a 24
     hour period.

          Like the date routines, many of the time routines require that
     you specify which time format to use. The enumerated type gTime
     contains the following members: HHMMSS, HHMM.

     Time:string;

          Returns the system time in a nicely formatted string. The time
     string uses a 12 hour clock and is appended with an a.m. or p.m.

     Clock;

          Writes the system time to the screen at a predetermined
     location. Defined within the GoldDate Unit are two variables,
     DateVars.ClockX and DateVars.ClockY which determine the location
     that the system time will be written.

     Hour(TStr:string;Format:gTime):word;

     Returns the hour portion of the specified time string.

     Minute(TStr:string;Format:gTime):word;

     Returns the minute portion of the specified time string.

     Second(TStr:string;Format:gTime):word;

     Returns the second portion of the specified time string.

     TimeStrToLong(TStr:string;Format:gTime):longint;

          Returns a longint value representing the number of seconds
     since midnight until the specified time string.

     LongToTimeStr(Secs:longint;Format:gTime;AmPm,Mltry:boolean):string;

          Returns a time string in the specified format that represents
     the specified number of seconds since midnight. An optional A.M. or
     P.M. may be appended, also the time may optionally be returned in
     military time.

     NowInLong:longint;

          Returns the number of seconds since midnight. This is based on
     the system time.

     ValidTime(Hr,Mn,Sc:longint;Format:gTime;Mltry:boolean):boolean;

          Returns TRUE if Hr, Mn, and Sc are all valid time values. You
     must specify the time format and whether or not you are using
     military time.

     ValidTimeStr(TStr:string;Format:gTime;Mltry:boolean):boolean;

          Returns TRUE if the specified time string is completely valid.
     You must specify the time format and whether or not you are using
     military time.

     StripTimeStr(TStr:string;Format:gTime):string;

     Removes all non-numeric characters from the specified time string.

     TimeToLong(H,M,S:word):longint;

          Converts the hour, minute and second specified to the number
     of seconds since midnight.

     TimeFormat(Format:gTime):string;

          The time format that is passed must be a member of the
     enumerated type, gTime. If Format is valid, a string representation
     of the Time format is returned, otherwise a null string will be
     returned.

     TimeDiff(StartTime, StopTime: longint): longint;

          Returns a longint value representing the number of seconds
     between StartTime and StopTime. If StartTime is greater than
     StopTime, the difference is spanned over midnight.

     LastDateError:integer;

     Returns the code of the last error generated by a GoldDate routine

