MFC中有兩個類:COleDatetime(以DATE為基礎(chǔ)),CTime(以__time64_t為基礎(chǔ)) 如果綁定的是日期型控件,,一定要用COleDatetime,!雖然CTime可以精確到3000年,但是超過這個范圍,,CTime是要拋出異常,,讓你程序崩潰的! 在MFC中操作時間的類主要有兩對:CTime和CTimeSpan與 COleDateTime和COleDateTimeSpan,,CTime和CTimeSpan主要封裝了ANSI time_t和關(guān)于time_t的Run-Time庫的主要函數(shù),,CTime里面使用的成員變量是time_t類型,該類型是個long型,,由于long 類型的原因,,所以該類只能處理4294967296秒約68年的數(shù)據(jù),所以用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")); 運行的結(jié)果是:1899-12-30 00:00:00 COleDateTime t; t.m_dt=39444.437731; AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S")); 運行的結(jié)果是:2007-10-28 10:30:20 反過來以可以得到變量的值,,例如: COleDateTime t(2004,12,28,22,22,22); CString str; str.Format("%f",t.m_dt); AfxMessageBox(str); 運行的結(jié)果是: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); 運行的結(jié)果是: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")); 運行的結(jié)果是:02/05/07 00:00:00 可是在使用COleDateTimeSpan類中以下的幾個函數(shù)可要小心,,這不知道是不是MFC的一個Bug,, double GetTotalDays( ) const; double GetTotalHours( ) const; double GetTotalMinutes( ) const; double GetTotalSeconds( ) const; 幾個函數(shù)的返回值都是double類型 但是,如double GetTotalSeconds( ) const;在MFC內(nèi)部的原形是: _AFXDISP_INLINE double COleDateTimeSpan::GetTotalSeconds() const { ASSERT(GetStatus() == valid); long lReturns = (long)(m_span * 24 * 60 * 60 + AFX_OLE_DATETIME_HALFSECOND); return lReturns; } 看到?jīng)]有,,它返回的實際是個long類型,,并不是一個double類型,所以在使用這幾個函數(shù)的時候計算兩個時間的間隔不要太大,,特別是 GetTotalSeconds( )函數(shù),,如計算兩個時間的間隔大于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); 運行的結(jié)果是:-2085892096.000000 這個結(jié)果明顯是一個溢出,如果使用 str.Format("%f",ts.m_span*86400); 則會得到2209075200.000000,。 所以靈活使用COleDateTime類的m_dt變量和COleDateTimeSpan類的m_span變量操作會得到意想不到的收獲 |
|