COleDateTime类本身不提供用于检索对象的time_t的接口,必须使用CTime的GetTime () )进行检索
coledatetimet1=cole datetime : get current time (;
系统时间系统;
T1.getassystemtime(systime;
ctimeCCT1(systime );
cout cct1.GetTime () endl;
MFC有两个基于cole datetime (基于date )和ctime (_ time 64 _ t )的类
如果绑定了日期类型控件,请确保使用COleDatetime! CTime到3000年为止是正确的,但是超过这个范围的话,CTime会抛出异常并使程序崩溃!
在MFC上操作时间的类主要有两组。 CTime和CTimeSpan以及COleDateTime和COleDateTimeSpan、CTime和CTimeSpan主要封装了有关ANSI time_t和time_t的Run-Time库的主要函数。 CTime此类型为long类型,long类型只能处理大约68年的4294967296秒的数据,因此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秒
酷睿数据时间t;
t.m_dt=0;
afxmessagebox (t.format (% y-% m-% d % h : % m 3360 % s ) );
运行结果为1899-12-30 00:00:00
酷睿数据时间t;
t.m_dt=39444.437731;
afxmessagebox (t.format (% y-% m-% d % h : % m 3360 % s ) );
执行结果: 2007-10-28 10:30:20
相反,可以按如下方式获得变量值:
coledatetimet(2004、12、28、22、22、22 );
CString str;
str.format('%f”,t.m_dt );
afxmessagebox(str;
执行结果: 38349.932199
COleDateTimeSpan类用于计算COleDateTime类的两个时间间隔,COleDateTimeSpan类为两个coledatetimespan :3360 m _ span为一个双精度类型,两个double
coledatetimet1(2006,1,1,0,0,0 );
coledatetimet2(2007,1,1,0,0,0 );
COleDateTimeSpan ts=t2-t1;
CString str;
str.format('%f”,ts.m_span );
afxmessagebox(str;
执行结果: 365.000000
相反,也可以得到日期
coledatetimet1(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的错误。
double GetTotalDays () const;
double GetTotalHours () const;
双地理空间() const;
double GetTotalSeconds () const;
一些函数的返回值都是double类型
但是,例如double GetTotalSeconds () const; 在MFC内部的真实身份如下。
_ afx disp _ inlinedoublecoledatetimespan : gettotalseconds () const
{assert(getstatus ()==valid );
longlreturns=(long ) ) m _ span * 24 * 60 * 60 afx _ ole _ datetime _ half second );
返回l返回;
}
不,实际上返回的是long类型,不是double类型,所以使用这些函数时两个时间之间的间隔不要太大。 尤其是GetTotalSeconds ) )函数,建议直接读取coledatetimespan:33333,因为如果计算两个时间间隔超过68年,则会溢出
coledatetimet1(2000,1,1,0,0,0 );
coledatetimet2(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变量进行操作会产生意想不到的结果