MFC中有两个类:COleDatetime(以DATE为基础),CTime(以__time64_t为基础) 如果绑定的是日期型控件,一定要用COleDatetime!虽然CTime可以精确到3000年,但是超过这个范围,CTime是要抛出异常,让你程序崩溃的! 在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变量操作会得到意想不到的收获 |
|