比较 COleDateTime 对象






4.86/5 (8投票s)
2001年11月15日
1分钟阅读

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 的值也几乎是完美的。希望这对您有所帮助。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。
