使用COleDateTime类的<操作符问题。

youngwolf 2005-05-17 08:40:46
程序如下(片断):
else if (CurrentTime < CurrentPageBeginTime)
{

CDC* pDC = GetDC();
CString str;
str.Format("%d-%d-%d %d:%d%d %d-%d-%d %d:%d%d",
CurrentTime.GetYear(), CurrentTime.GetMonth(), CurrentTime.GetDay(),
CurrentTime.GetHour(), CurrentTime.GetMinute(), CurrentTime.GetSecond(),
CurrentPageBeginTime.GetYear(), CurrentPageBeginTime.GetMonth(), CurrentPageBeginTime.GetDay(),
CurrentPageBeginTime.GetHour(), CurrentPageBeginTime.GetMinute(), CurrentPageBeginTime.GetSecond());
pDC->TextOut(100, 0, str);
ReleaseDC(pDC);
}

上面的程序结果大家一定不相信,打印出来的时间完全相等!我想可能是两个类在毫秒级上不相等,于是改程序如下:
SYSTEMTIME t1, t2;
CurrentTime.GetAsSystemTime(t1);
CurrentPageBeginTime.GetAsSystemTime(t2);
str.Format("%d %d", t1.wMilliseconds, t2.wMilliseconds);
结果打印出来也完全相等,请问为什么?我一定要作时间的比较!
...全文
234 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2005-05-17
  • 打赏
  • 举报
回复
请问能解释一下吗?m_dt*86400*1000这个数很容易越界啊。
vcmute 2005-05-17
  • 打赏
  • 举报
回复
比较.m_dt*86400*1000
youngwolf 2005-05-17
  • 打赏
  • 举报
回复
different status只有在有等于判断符的时候有效,如<=,>=,==等,有MSDN为证:
COleDateTime dateOne(95, 3, 15, 12, 0, 0); // 15 March 1995 12 noon
COleDateTime dateTwo(dateOne); // 15 March 1995 12 noon
BOOL b;
b = dateOne == dateTwo; // TRUE

dateTwo.SetStatus(COleDateTime::invalid);
b = dateOne == dateTwo; // FALSE, different status
b = dateOne != dateTwo; // TRUE, different status
b = dateOne < dateTwo; // FALSE, same value
b = dateOne > dateTwo; // FALSE, same value
b = dateOne <= dateTwo; // TRUE, same value
b = dateOne >= dateTwo; // TRUE, same value

我要比较两个时间谁在前,谁在后,请问如何使用GetTickCount(),我是取数据库中的数据画曲线!!!
koko1998 2005-05-17
  • 打赏
  • 举报
回复
different status?
koko1998 2005-05-17
  • 打赏
  • 举报
回复
求运行的时间差的话,一般使用GetTickCount()函数
youngwolf 2005-05-17
  • 打赏
  • 举报
回复
to vcmute(横秋)
我是取出数据库中的记录画曲线,所以你说的函数对我来说没有用,请问两个COleDateTime到底如何比较?要说浮点数不精确,那么我如下:
thisTimeSpan = CurrentTime - CurrentPageBeginTime;
d = thisTimeSpan.GetTotalSeconds();
if (d < .0) //代替原来的CurrentTime < CurrentPageBeginTime
上面的程序却可以准确判断,再也不会打印出来完全相等的东西了(打印出来都是不相等的时候,看来d < .0是可以准确判断,而CurrentTime < CurrentPageBeginTime却不能,为什么)
dfyang 2005-05-17
  • 打赏
  • 举报
回复
COleDateTime的数值m_dt是double型数,而double型数比较本来就不太精确
vcmute 2005-05-17
  • 打赏
  • 举报
回复
和GetTickCount一样timeGetTime返回的是启动后的时间长度

MMRESULT timeGetSystemTime(
LPMMTIME pmmt,
UINT cbmmt
);
可以得到毫秒级
vcmute 2005-05-17
  • 打赏
  • 举报
回复
GetTickCount()
youngwolf 2005-05-17
  • 打赏
  • 举报
回复
天地良心,下面是我从我的程序中拷贝出来的程序片断:
else if (CurrentTime < CurrentPageBeginTime)
{
d = (CurrentTime - CurrentPageBeginTime).GetTotalSeconds();
if (.0 == d)
{
CDC* pDC = GetDC();
pDC->TextOut(100, 0, "123");
ReleaseDC(pDC);
}
}

理论上是不可能打印出123的,而事实上常常打印出来123
看来COleDateTime类的比较很不准确!
但我不明白,同样是用浮点数记录时间,为什么COleDateTimeSpan类却很准确?
有没有以年月日时分秒保存的时间类啊?虽然存储空间大点,但对于一个硕大的COleDateTime类,增加几个字节又算什么呢!这样就能精确的判断时间了。
youngwolf 2005-05-17
  • 打赏
  • 举报
回复
既然两个相等的时间判断(CurrentTime < CurrentPageBeginTime)结果为真,既不等,那么再乘以86400*1000怎么会变成相等了呢?
vcmute 2005-05-17
  • 打赏
  • 举报
回复
m_dt*86400*1000结果还是double,怕越界可用INT64(实际上也是8字节,同double)
m_dt是DATE类型,单位为天,*86400成秒级别,*1000成毫秒级别

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧