MFC CTIME 对象之间时间差 CTimeSpan

1.先举个例子:
CTime StartDay,StartTime;
CTime StopDay,StopTime;
CTime Now;
CTimeSpan timeSpan1;
//得到两时间的间隔….. 注:ctimespan最大 只到天,不到月、年
timeSpan1= StopTime - StartTime;
if(StartDay==StopDay && timeSpan1.GetTotalSeconds()<40)
{
MessageBox(“开始时间与结束时间不能相差少于40秒!”);
return FALSE;
}
//获取当前系统时间
Now = CTime::GetCurrentTime();
//初始化方式这种也有
Now = CTime(2004,1,1,0,0,0,-1);

注意GetTotalSeconds与GetSeconds的区别:GetTotalSeconds返回总的秒数,GetSeconds返回总是小于60,如:如果时间经过了100秒, GetTotalSeconds返回100,而GetSeconds返回40,因为有60秒转为一分钟了,同时使用GetMinutes会返回1,即1分40秒

2.先人的指导测试:
第一种:
CTime time1=CTime::GetCurrentTime();
     int nYear=time1.GetYear();
     int nMonth=time1.GetMonth();
     int nDay=time1.GetDay();
     int nHour=time1.GetHour();
     int nMinute=time1.GetMinute();
     int nSecond=time1.GetSecond();
第二种:    
CTime time2(nYear,nMonth,nDay,10,57,40);
//注意:ctime赋值的时候,不知为什么,用“=”结果就不一样了,要变量紧跟括号赋值方式。
比较:  
     if (time1>time2 )
     AfxMessageBox(“1”);
     else
     AfxMessageBox(“2”);
    
3.相关知识
CTime(const SYSTEMTIME& st,int nDST = - 1) ;

   以一个SYSTEMTIME结构体变量来构造CTime对象。SYSTEMTIME结构体也是我们对日期时间的常用表示方式。参数st为以本地时间表示的SYSTEMTIME对象,参数nDST同上。

   static CTime WINAPI GetCurrentTime( );

   获取系统当前日期和时间。返回表示当前日期和时间的CTime对象。

   int GetYear( ) const;

   获取CTime对象表示时间的年份。范围从1970年1月1日到2038年(包括2038年)1月18日。

   int GetMonth( ) const;

   获取CTime对象表示时间的月份。范围为1到12。

   int GetDay( ) const;

   获取CTime对象表示时间的日期。范围为1到31。

   int GetHour( ) const;

   获取CTime对象表示时间的小时。范围为0到23。

   int GetMinute( ) const;

   获取CTime对象表示时间的分钟。范围为0到59。    

   int GetSecond( ) const;

   获取CTime对象表示时间的秒。范围为0到59。

   int GetDayOfWeek( ) const;

   此函数的返回值表示CTime对象代表的是星期几,1表示是周日,2表示是周一,以此类推。
   operator == :    比较两个绝对时间是否相等。
   operator != :    比较两个绝对时间是否不相等。
   operator > :    比较两个绝对时间,是否前一个大于后一个。
   operator < :    比较两个绝对时间,是否前一个小于后一个。
   operator >=    : 比较两个绝对时间,是否前一个大于等于后一个。
   operator <=    : 比较两个绝对时间,是否前一个小于等于后一个。

CString Format(LPCTSTR pszFormat) const;

%a:周的英文缩写形式。
%A:周的英文全名形式。
%b: 月的英文缩写形式。
%B:月的英文全名形式。
%c: 完整的日期和时间。
%d:十进制形式的日期(01-31)。
%H:24小时制的小时(00-23)。
%I: 12小时制的小时(00-11)。
%j: 十进制表示的一年中的第几天(001-366)。
%m: 月的十进制表示(01-12)。
%M:十进制表示的分钟(00-59)。
%p: 12小时制的上下午标示(AM/PM)。
%S: 十进制表示的秒(00-59)。
%U: 一年中的第几个星期(00-51),星期日是一周的第一天。
%W: 一年中的第几个星期(00-51),星期一是一周的第一天。
%w: 十进制表示的星期几(0-6)。
%Y: 十进制表示的年。

4.拓展知识:
在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变量操作会得到意想不到的收获

支持先人:
http://blog.csdn.net/hejianhua/article/details/7590096
http://blog.csdn.net/lebao82/article/details/12164079

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值