65.9K
CodeProject 正在变化。 阅读更多。
Home

比较 COleDateTime 对象

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (8投票s)

2001年11月15日

1分钟阅读

viewsIcon

117538

解决 COleDateTime 比较方法工作不正常的问题

引言

我检测到 COleDateTime ==, <, >, <=, >= 运算符存在以下问题。COleDateTime 对象在内部由一个 double 类型表示。因此,当比较两个 COleDateTime 对象时,实际上是在比较两个 double 类型的值,这会导致问题。例如,我发现两个在人类可读格式中完全相等的 COleDateTime 对象,使用 COleDateTime == 运算符却显示为不相等。

解决方案

请自行进行比较,基于 COleDateTime 对象的字符串比较。我现在使用的函数如下:

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;
}

在使用 COleDateTimeSpan 对象进行编程时,以下内容也可以提供帮助。假设您想从某个时间点开始生成一系列 15 分钟的 ColeDateTime 对象。通常,人们会这样编写程序:

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;
}

但是,将循环体替换为以下内容会更准确:

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

这样,循环过程中不会累积误差,即使在最后一次循环迭代中,变量 TimeToUse 的值也几乎是完美的。希望这对您有所帮助。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.