Groups | Blog | Home
all groups > dotnet framework > may 2006 >

dotnet framework : FoxPro Date Processing


brendan.mckenzie NO[at]SPAM gmail.com
5/18/2006 11:24:59 PM
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
Kalpesh
5/19/2006 1:05:56 AM
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
Brendan McKenzie
5/19/2006 1:18:53 AM
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

[quoted text, click to view]
Brendan McKenzie
5/19/2006 2:10:13 AM
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