65.9K
CodeProject is changing. Read more.
Home

Comparing COleDateTime Objects

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (8 votes)

Nov 15, 2001

1 min read

viewsIcon

116874

Solution to the bad working COleDateTime comparing methods

Introduction

I detected the following problem with the COleDateTime ==, <, >, <=, >= operators. A COleDateTime object is internally represented by a double. So, when comparing two COleDateTime objects, it is in fact two doubles that are being compared and this means trouble. For example, I saw that two COleDateTime objects that were perfectly equal (in human readable format) were indicated as not equal with the COleDateTime == operator.

Solution

Do the comparing yourself based on a string-compare of the COleDateTime objects. These are the functions that I am using now.

BOOL DatesEqual(COleDateTime &odt1, COleDateTime &odt2)
{
    CString str1 = odt1.Format();
    CString str2 = odt2.Format();

    return (!str1.Compare(str2));
}

BOOL DateSmallerThan(COleDateTime &odt1, 
    COleDateTime &odt2)
{
    if (DatesEqual(odt1, odt2)) 
        return FALSE;
    else 
        return odt1 < odt2;
}

BOOL DateGreaterThan(COleDateTime &odt1, 
    COleDateTime &odt2)
{
    if (DatesEqual(odt1, odt2)) 
        return FALSE;
    else 
        return odt1 > odt2;
}

BOOL DateSmallerThanOrEqual(COleDateTime &odt1, 
    COleDateTime &odt2)
{
    if (DatesEqual(odt1, odt2)) 
        return TRUE;
    else 
        return odt1 < odt2;
}

BOOL DateGreaterThanOrEqual(COleDateTime &odt1, 
    COleDateTime &odt2)
{
    if (DatesEqual(odt1, odt2)) 
        return TRUE;
    else 
        return odt1 > odt2;
}

Another aid in programming more accurate when using COleDateTimeSpan objects is the following. Suppose you want to produce a sequence of 15 minute ColeDateTime objects, starting at some point in time. Normally, one would program this something like:

COleDateTimeSpan span;
span = COleDateTimeSpan(0,0,15,0);
ColeDateTime StartTime, DateTimeWalker;
StartTime = ...; //init with the first moment
DateTimeWalker = StartTime;
for (int i=0; i<NR_OF_QUARTERS; i++)
{
    //do something with DateTimeWalker
    ...
    DateTimeWalker += span;
}

However, it is more accurate to replace the body of the loop by:

{
    COleDateTimeSpan dtsSpan(0,0,i*15,0);
    COleDateTime TimeToUse = StartTime + dtsSpan;
    //do something with TimeToUse
    ...
}

This way, no error is accumulated during the loop, resulting in an almost perfect value for the variable TimeToUse even for the last loop iteration. Hope this is helpful to you.

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.