Date Processing

Chapter Updated 2/12/99

The objective of this chapter is to provide information regarding
the basic concepts of date arithmetic and supply generic
C/C++ date methods.

Two common things of all programmers is that if they write
enough code, they will eventually have to deal with dates. They
may be Julian dates, Gregorian dates, or a date with their best
freind's girl, but they'll eventually be working with dates. The
other thing is that most programmers don't have the time or don't
want to spend time writing mundane date routines.

To explain how dates work, I'll give a brief overview and history of Julian
dates, Gregorian dates, leap years and leap centuries.
## Leap Years

Due to the fact that it actually takes about 365 1/4 days for
the earth to circle the sun, every fourth year and every fourth
century have an extra day added to the end of February and the year
is called a leap year. Leap years have 366 days, non leap years
have 365 days. The following code segment describes how to
determine if a given year is a leap year.
A leap year is a year having 366 days, which can be evenly
divisible by 4 and not by 100 or divisible by 400.
There are also leap centuries. Leap centuries are years which
are evenly divisible by 400.
To calculate a leap year, the following code segment can be used
int year;
if(( year % 4 == 0 && year % 100 != 0 ) || year % 400 = 0 )
LEAP_YEAR = TRUE;
else
LEAP_YEAR = FALSE
## Julian Dates

Around the time of Jesus Christ, a fellow with the name of Julias Ceasar
established the Julian calendar. The Julian calendar established every
fourth year as a leap year with 366 days and all other years having 365 days.
The months were set up the same as they are with a Gregorian calendar, which
is what we use today. A Julian date is defined as as the number of days from the
first day of the year; February 1 would have a Julian day of 32.

From a programmer's perspective, Julian dates are useful for doing date
arithmetic, determining the difference between two dates or calculating
a future or past date.

To determine the difference between two dates, convert both dates to a
Julian date and subtract one from the other.

To calculate a future or past date, convert the base date to a Julian date,
add (or subtract) the number of days necessary to (from) it and convert the
julian date back to a Gregorian date.

The Julian date routines use a base date of 01/01/1900.

## Gregorian Dates

In 1582, Pope Gregor XIII introduced a corrected form of the Julian calendar.
Every 4th year still has 366 days except for century years. Century years
were added as leap years if evenly divisible by 400. The year 2000 is a leap century.

The methods supplied with this software are based on gregorian dates with
the format of CCYYMMDD for century, year, month and day.

## CASTELLANO options

There is an option in the *options.h* file for enabling the date routines
to return Spanish values for days, weeks and months.

#define CASTELLANO

## Date Formats

All dates are stored in the .DBF files with format CCYYMMDD.

All date routines work with dates formated with the same CCYYMMDD format.

## Sample Program

#include
#include
main()
{
xbXBase x;
long l;
cout << "\nThis program tests the XDATE routines\n\n";
cout << "\nThis year is " << x.YearOf ( x.Sysdate() );
cout << "\nThis Month is " << x.MonthOf( x.Sysdate() );
cout << "\nToday is day " << x.DayOf( WEEK, x.Sysdate()) << " of the week";
cout << "\nToday is day " << x.DayOf( MONTH, x.Sysdate()) << " of the month";
cout << "\nToday is day " << x.DayOf( YEAR, x.Sysdate()) << " of the year";
if( x.IsLeapYear( x.Sysdate()))
cout << "\nThis is a leapyear";
else
cout << "\nThis is not a leap year.";
cout << "\nToday is " << x.Sysdate();
if( x.DateIsValid( "19951301" ))
cout << "\n19951301 is a valid date";
else
cout << "\n19951301 is not a valid date";
l = x.JulianDays( "19951101" ) - x.JulianDays( "19951001" );
cout << "\nThere are " << l
<< " days between 10/1/95 and 11/1/95.";
cout << "\nIn 7 days it will be "
<< x.JulToDate8( x.JulianDays( x.Sysdate()) + 7L );
cout << "\nToday is " << x.CharDayOf( x.Sysdate());
cout << "\nThis month is " << x.CharMonthOf( x.Sysdate());
cout << "\nFormat (YYDDD) ";
cout << x.FormatDate( "YYDDD", x.Sysdate());
cout << "\nFormat (MM/DD/YY) ";
cout << x.FormatDate( "MM/DD/YY", x.Sysdate());
cout << "\nFormat (MMMM DD,YYYY) ";
cout << x.FormatDate( "MMMM DD,YYYY", x.Sysdate());
cout << "\nFormat (DDDD, MMMM DD YYYY) ";
cout << x.FormatDate( "DDDD, MMMM DD YYYY", x.Sysdate());
cout << "\n";
}

Send me mail - xbase@startech.keller.tx.us

(c)1997 StarTech