久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

COleDatetime和CTime的區(qū)別

 源碼無限 2012-12-26
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變量操作會得到意想不到的收獲

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多