在MFC中操作时间的类主要有两对:CTime和CTimeSpan与COleDateTime和COleDateTimeSpan,CTime和CTimeSpan主要封装了ANSI time_t和关于time_t的Run-Time库的主要函数,CTime里面使用的成员变量是time_t类型,该类型是个long型,由于long类型的原因,所以该类只能处理4294967296秒约68年的数据,所以用CTime只能处理1970年到2038年的日期。
    幸好,MFC同时提供了COleDateTime和COleDateTimeSpan类,使用该两个类完全可以代替CTime和CTimeSpan,COleDateTime和COleDateTimeSpan类所使用的成员变量是DATE类型,该类型是个double类型,而且使用的单位是日,所以可以处理从100年1月1日到9999年12月31日的日期时间,COleDateTime类的日期计算主要是操作公有成员变量COleDateTime::m_dt,该变量是DATE即double类型,该变量是为零时是1899年12月30日0时0分0秒,大于零时的日期比1899年12月30日0时0分0秒大,反之亦然,例如:
COleDateTime t;
t.m_dt=0;
AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S"));
运行的结果是:1899-12-30 00:00:00

COleDateTime t;
t.m_dt=39444.437731;
AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S"));
运行的结果是:2007-10-28 10:30:20

反过来以可以得到变量的值,例如:
COleDateTime t(2004,12,28,22,22,22);
CString str;
str.Format("%f",t.m_dt);
AfxMessageBox(str);
运行的结果是:38349.932199

COleDateTimeSpan类是用于对COleDateTime类的两个时间的时间间隔的计算,COleDateTimeSpan类使用的成员变量COleDateTimeSpan::m_span是一个double类型是用于记录两个COleDateTime::m_dt的时间差,例如:
COleDateTime t1(2006,1,1,0,0,0);
COleDateTime t2(2007,1,1,0,0,0);
COleDateTimeSpan ts=t2-t1;
CString str;
str.Format("%f",ts.m_span);
AfxMessageBox(str);
运行的结果是:365.000000

反过来也可以得到日期
COleDateTime t1(2006,1,1,0,0,0);
COleDateTimeSpan ts;
ts.m_span=400.0;
COleDateTime t2=t1+ts;
AfxMessageBox(t2.Format("%c"));
运行的结果是:02/05/07 00:00:00

可是在使用COleDateTimeSpan类中以下的几个函数可要小心,这不知道是不是MFC的一个Bug,
double GetTotalDays( ) const;
double GetTotalHours( ) const;
double GetTotalMinutes( ) const;
double GetTotalSeconds( ) const;
几个函数的返回值都是double类型
但是,如double GetTotalSeconds( ) const;在MFC内部的原形是:
_AFXDISP_INLINE double COleDateTimeSpan::GetTotalSeconds() const
{ ASSERT(GetStatus() == valid);
   long lReturns = (long)(m_span * 24 * 60 * 60 + AFX_OLE_DATETIME_HALFSECOND);
   return lReturns;
}
看到没有,它返回的实际是个long类型,并不是一个double类型,所以在使用这几个函数的时候计算两个时间的间隔不要太大,特别是GetTotalSeconds( )函数,如计算两个时间的间隔大于68年时就会溢出,所以我建议直接读取COleDateTimeSpan::m_span变量的值,这是一个单位为日的时间间隔,例如:
COleDateTime t1(2000,1,1,0,0,0);
COleDateTime t2(2070,1,1,0,0,0);
COleDateTimeSpan ts=t2-t1;
CString str;
str.Format("%f",ts.GetTotalSeconds());
AfxMessageBox(str);
运行的结果是:-2085892096.000000
这个结果明显是一个溢出,如果使用
str.Format("%f",ts.m_span*86400);
则会得到2209075200.000000。

所以灵活使用COleDateTime类的m_dt变量和COleDateTimeSpan类的m_span变量操作会得到意想不到的收获

COleDateTime和COleDateTimeSpan类相关推荐

  1. COleDateTime和COleDateTimeSpan类详细分析

    在MFC中操作时间的类主要有两对:CTime和CTimeSpan与COleDateTime和COleDateTimeSpan,CTime和CTimeSpan主要封装了ANSI time_t和关于tim ...

  2. COleDateTime获取对象的time_t

    COleDateTime类本身没有提供获取对象的time_t的接口,需要使用CTime的GetTime()来实现获取 COleDateTime t1 = COleDateTime::GetCurren ...

  3. 【转】【VC】VC程序运行时间测试函数

    1:Sleep函数 使用: sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟: Linux下表示1000秒,Linux ...

  4. MFC 使用datetimepicker获取时间

    CTime time = CTime::GetCurrentTime(); int year = time.GetYear(); //返回年 int mouth = time.GetMouth(); ...

  5. 时间的函数Sleep,clock,GetTickCount,QueryPerformanceCounter

    介绍 我 们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都 会用到时间函数.还比如我们通过记录函数或者算 ...

  6. mfc小工具开发之定时闹钟之---时间获取和音频播放

    1.这里的音频文件是指*.wav格式的音频,参考了飞雪的音频文件,版本号: 飞雪桌面日历 v2.84.1025 绿色版 http://www.piaodown.com/down/soft/18512. ...

  7. MFC的COleDateTime类在时间中的用法

    COleDateTime类是没有基类的,它封装了MFC的DATE数据类型,并提供了一系列的方法,来操作DATE结构体中的信息.DATE数据类型在OLE automation中会用到,且其为VARIAN ...

  8. MFC的COleDateTime类使用

    MFC的COleDateTime类使用 经常在软件开发中用到计算执行某个功能的耗时,有必要深入研究下COleDateTime类,以备不时之需.闲话少叙,书归正传,下面我们就一起来看看,该如何使用这个类 ...

  9. COleDateTime::ParseDateTime

    COleDateTime::ParseDateTime 分析字符串读取日期/时间值. bool ParseDateTime(LPCTSTR lpszDate,DWORD dwFlags = 0,LCI ...

最新文章

  1. 评分卡模型、WOE(Weight of Evidence)和IV(Information Value)
  2. 用户看法调查结果及分析(四)
  3. Csharp关键字----delegate(委托)
  4. swagger报错No handler found for GET /swagger-ui.html
  5. Servlet_体系结构
  6. Opportunity的chance of success的赋值逻辑
  7. BIC无代码绘制差异基因火山图
  8. Git笔记(30) 重写历史
  9. Maven 私服 Version policy mismatch, cannot upload SNAPSHOT content to RELEASE repositories for file‘0’
  10. 【转】Zookeeper入门
  11. GDAL使用DEM数据计算山体阴影(Hillshade)
  12. 信息安全系统设计基础实验二:固件设计
  13. ffmpeg代码实现自定义encoder
  14. 怎么把优酷的kux格式转换成mp4?快速转换kux格式的技巧
  15. 怎么把office卸载干净?
  16. R语言使用strsplit函数按照指定的分隔符号进行数据拆分、分裂(split)、分割后的数据类型为列表
  17. docx行间距怎么设置_word2017如何设置行间距.docx
  18. 如何连接局域网_Minecraft我的世界局域网联机问题(windows平台)
  19. 基于Linux IIO接口的波形采集
  20. P1234小A的口头禅

热门文章

  1. 在Unity3d项目中利用Udp进行局域网内通信
  2. smarty实例教程一
  3. MCM/ICM(美国大学生数学建模竞赛)报名指南
  4. kettle-数据迁移场景
  5. Java对字母移动三位加密_4动手动脑,总结及凯撒加密
  6. 等保2.0.第九章.等保2.0基础知识
  7. 英文查错系统【浙江工商大学oj 测试点分析】
  8. 通过全局钩子发送自定义消息,实现进程通信
  9. xmind 使用详解
  10. 非模态对话框和模态对话框_创建