Home All Groups Group Topic Archive Search About

FoxPro Date Processing

Author
19 May 2006 6:24 AM
brendan.mckenzie
Hello,

I am writing a class to process FoxPro .dbf files, all has been going
well, but I have recently hit a snag.  I'm trying to convert FoxPro's
DateTime field (T) to a System.DateTime.  FoxPro's field is 2 32bit
integers: one stores the date, the other stores the time, stored in
reverse byte order. (2f 4a 12 9a== 9a 12 4a 2f)

Easy... here's the hard part.  The date integer stores the number of
days from 1/1/4712BC (yes... BC).  The time integer stores the number
of milliseconds from 00:00:00.

Processing the time was easy ( DateTime.AddMilliseconds() ).
Processing the date, is not.

Is there anyone who can lend a hand and help me process this date?

The date integer: 2453809 should become 20/04/2006

My current process is:

DateTime dt = new DateTime(1, 1, 1);
dt = dt.AddDays(days);
dt = dt.AddYears(-4713);

This results in a DateTime which is 2 days off, and I'm afraid it may
result in more problems due to leap years with other dates.

Can anyone help me out with this?

Thanks!

Brendan

Author
19 May 2006 8:05 AM
Kalpesh
BTW, how are you reading the dbf files?
I suppose, it will be better to read dbf files using oledb provider
which supports reading foxpro files

HTH
Kalpesh
Author
19 May 2006 8:18 AM
Brendan McKenzie
If only it were that simple... the tables in the database rely on some
..prg files that were compiled into the foxpro application, meaning I
can't access the data unless I'm accessing it through the application
that was written.  Considering this is a 3rd party addon for the
application, I don't have such luxuries.

I'm reading the dbf files using a FileStream and BinaryReader combo.
Using the following website as my reference:

http://www.clicketyclick.dk/databases/xbase/format/dbf.html

Kalpesh wrote:

Show quote
> BTW, how are you reading the dbf files?
> I suppose, it will be better to read dbf files using oledb provider
> which supports reading foxpro files
>
> HTH
> Kalpesh
Author
19 May 2006 9:10 AM
Brendan McKenzie
The Solution:

[code]
        byte[] ArrDate = new byte[] { Data[Offset], Data[Offset + 1],
Data[Offset + 2], Data[Offset + 3] };
        byte[] ArrTime = new byte[] { Data[Offset + 4], Data[Offset + 5],
Data[Offset + 6], Data[Offset + 7] };
        int LngDate = BitConverter.ToInt32(ArrDate, 0);
        int LngTime = BitConverter.ToInt32(ArrTime, 0);

        if ((LngDate * LngTime) != 0)
        {
            LngDate -= 1721426;
            DateTime dt = new DateTime(1, 1, 1, 0, 0, 0);

            dt = dt.AddMilliseconds(LngTime);
            dt = dt.AddDays(LngDate);

            return dt;
        }
        else
        {
            return null;
        }
[!code]

Quote: "work out what FoxPro's date is at 1/1/0001, then try working
relative to that"

AddThis Social Bookmark Button