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