在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. 集合框架源码分析四(Collections类详细分析)

    我认为Collections类主要是完成了两个主要功能  1.提供了若干简单而又有用的算法,比如排序,二分查找,求最大最小值等等.  2.提供对集合进行包装的静态方法.比如把指定的集合包装成线程安全的 ...

  3. Media Player Classic - HC 源代码分析 9:CFGManager类详细分析(CFGManager)

    上一篇文章分析了Media Player Classic - HC(mpc-hc)的源代码中的CFGManager类的RenderFile函数: Media Player Classic - HC 源 ...

  4. java之ResourceBundle类详细分析(全)

    目录 前言 1. 配置文件 2. 方法 3. 实战 前言 主要的作用: 当程序需要一个特定于语言环境的资源时(如 String),程序中可从当前的用户环境资源包中加载它.使得编写在很大程序上只是独立于 ...

  5. SpringMVC之ModelAndView类详细分析(全)

    目录 前言 1. 方法 2. 配置 3. addObject 添加对象详解 4. 重定向 前言 通过查看源码可以得知 这个类主要是 在web MVC框架中的模型和视图的Holder. 请注意,这些是完 ...

  6. 色差类染疵原因的详细分析

    色差类染疵原因的详细分析 纺织物染整加工,前前后后对染整结果总的影响因素比较多,故在实际大生产中,经常会遇到这样那样的质量问题,其中与色泽有关的尤为频繁,而可列第一位的便是色差问题. 1 色差的分类 ...

  7. Yolov1目标检测算法详细分析

    Yolov1目标检测算法详细分析 Yolov1介绍 这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字: ...

  8. C语言中的static 详细分析

    google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...

  9. 新手向:从不同的角度来详细分析Redis

    最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...

最新文章

  1. 03-Java的基础语法
  2. 三级网络技术_三级网络技术考前选择题—VLAN
  3. 如何利用大数据做金融风控? 原创 2016年11月24日 17:42:03 标签: 大数据 / 金融 / 风控 1594 导语:如何通过海量数据与欺诈风险进行博弈? 随着金融科技、科技金融等概念的
  4. 游戏服务器端引擎——DogSE的设计
  5. Struts 学习笔记2(输入校验、国际化、异常处理)
  6. 13个开发者技能必知必会!
  7. 秋招面试我去了拼多多,直接被问JVMGC底层原理和算法,我吊打面试官
  8. python 内存_一行Python解决内存问题
  9. 你有什么相见恨晚的知识想推荐给年轻人?
  10. java后端模拟http请求_Http请求后端
  11. 一个不限制插值个数和上采样倍数的视频增强方法
  12. 收藏 | 使用Pytorch从头实现Canny边缘检测
  13. linux下gimp工具栏,Gimp使用小技巧
  14. python接口自动化(三十九)- logger 日志 - 上(超详解)
  15. JavaScript高级使用(一)--参数Arguments对象
  16. android11电视,谷歌发布首款Android TV版 基于Android 11开发者预览版
  17. 热点:阿里云推国内首个高级政务云平台
  18. linux系统双显卡切换显卡驱动,自动化系统Linux显卡驱动及BIOS设置笔记(NVIDIA/ATI)...
  19. 如何实现一个二维码支持微信支付和支付宝支付
  20. 深入理解Linux启动过程 0号进程,1号进程

热门文章

  1. 人体生物钟程序编制(C语言)
  2. WebGIS开发软件安装问题
  3. 树莓派4b 安装摄像头
  4. 字符串的输出puts与输入gets(C语言)
  5. java时间解析错误_java.lang.IllegalArgumentException:解析错误-日期格式错误?
  6. 打印1900年到2020年内的所有闰年
  7. 直面OA选型八大误区
  8. vue 自适应屏幕的宽高度
  9. AD模数转化电路的一种实现方式
  10. 美国地质调查局SRTM--30米DEM数据