/// DB OLE VT_DATE data receiver (with sugar;).
class VDate
{
public:
VDate(const _variant_t& v);
VDate(int yy, int mon, int ddd);
int day() const { return d; }
int month() const { return m; }
int year() const { return y; }
const char* strdmy() const;
const char* strymd() const;
bool isEmpty() const { return dd == 0; }
bool isNull() const { return isEmpty(); }
VDate& operator =(const _variant_t& v);
bool operator ==(const VDate& vd) const
{ return dd == vd.dd; }
bool operator < (const VDate& vd) const
{ return dd < vd.dd; }
bool operator <=(const VDate& vd) const
{ return dd <= vd.dd; }
bool operator !=(const VDate& vd) const
{ return dd != vd.dd; }
bool operator > (const VDate& vd) const
{ return dd > vd.dd; }
bool operator >=(const VDate& vd) const
{ return dd >= vd.dd; }
private:
mutable char str[20];
bool cvtdos(double val);
unsigned short dd, dt;
int d, m, y;
int h, mm, s; // not used...
};
// Implementation:
VDate& VDate::operator =(const _variant_t& v)
{
if (v.vt == VT_DATE)
cvtdos(v);
else
{
dd = dt = 0;
y = m = d = h = mm = s = 0;
}
memset(str,0,sizeof str);
return *this;
}
VDate::VDate(const _variant_t& v):dd(0),dt(0),
d(0), m(0), y(0), h(0), mm(0), s(0)
{
if (v.vt == VT_DATE)
cvtdos(v);
memset(str,0,sizeof str);
}
VDate::VDate(int yy, int mon, int ddd):dd(0), dt(0),
d(0), m(0), y(0), h(0), mm(0), s(0)
{
if (yy > 0 && mon >= 1 && mon <= 12 && ddd >= 1
&& ddd <= 31)
{
if (yy < 29)
yy += 2000;
y = yy;
m = mon;
d = ddd;
dd = ddd | (m<<5) | ((yy-1980)<<9);
}
memset(str,0,sizeof str);
}
const char* VDate::strdmy() const
{
if (dd)
{
if (!*str || str[2] != '.')
{
_snprintf(str,sizeof str,"%02d.%02d.%04d",d,m,y);
}
}
return str;
}
const char* VDate::strymd() const
{
if (dd)
{
if (!*str || str[2] != '.')
{
_snprintf(str,sizeof str,"%04d-%02d-%02d",y,m,d);
}
}
return str;
}
bool VDate::cvtdos(double val)
{
if (VariantTimeToDosDateTime(val,&dd,&dt))
{
d = dd & 0x1F;
m = (dd>>5) & 0xF;
y = (dd >> 9) + 1980;
if (dt)
{
s = (dt & 0x1F) << 1;
mm = (dt >> 5) & 0x3F;
h = dt >> 11;
}
return true;
}
else
dd = dt = 0;
return false;
}