Click here to Skip to main content
15,881,852 members
Articles / Desktop Programming / MFC

Comparing COleDateTime Objects

Rate me:
Please Sign up or sign in to vote.
4.86/5 (8 votes)
14 Nov 20011 min read 115.8K   18   14
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.

C++
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:

C++
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:

C++
{
    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.


Written By
Software Developer (Senior)
Belgium Belgium
The first 5 years of my career I programmed in pure C. (Production automatisation software)
In Q4 of 1997 I switched to Visual C++/MFC. (Headend Management system for cable operators)
In Q1 of 2003 I changed job and started programming in JAVA (and Swing)
Later on I also worked in Adobe Flex, GWT and GXT.
Then, since our products became more web based, I started programming in JavaScript and Sencha ExtJS.
In my current job I program in Java, TypeScript and React.

Comments and Discussions

 
Questionhow COleDateTime create m_dt (Double),what isformula? Pin
vahid_m_200817-Jun-08 3:34
vahid_m_200817-Jun-08 3:34 
Questionhow COleDateTime create m_dt (Double),what it formula? Pin
vahid_m_200817-Jun-08 3:34
vahid_m_200817-Jun-08 3:34 
GeneralPlease don't do this! Pin
Marc Brooks28-Nov-01 12:09
Marc Brooks28-Nov-01 12:09 
GeneralRe: Please don't do this! Pin
28-Nov-01 20:24
suss28-Nov-01 20:24 
GeneralQuestion Pin
Brian V Shifrin16-Nov-01 4:05
Brian V Shifrin16-Nov-01 4:05 
GeneralRe: Question Pin
18-Nov-01 21:36
suss18-Nov-01 21:36 
GeneralRe: Question Pin
Brian V Shifrin6-Jan-02 6:31
Brian V Shifrin6-Jan-02 6:31 
GeneralRe: Question Pin
6-Jan-02 20:48
suss6-Jan-02 20:48 
GeneralRe: Question Pin
Sachin Dedhia13-Feb-02 1:27
Sachin Dedhia13-Feb-02 1:27 
GeneralRe: Question Pin
Beaker18-Nov-01 22:02
Beaker18-Nov-01 22:02 
Generalquick fix? Pin
Strifter16-Jan-03 6:06
Strifter16-Jan-03 6:06 
GeneralRe: quick fix? Pin
Geert Delmeiren16-Jan-03 20:19
Geert Delmeiren16-Jan-03 20:19 
GeneralRe: quick fix? Pin
Geert Delmeiren16-Jan-03 20:28
Geert Delmeiren16-Jan-03 20:28 
GeneralRe: quick fix? Pin
Midnight48918-Mar-03 10:14
Midnight48918-Mar-03 10:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.