COleDateTime和COleDateTimeSpan類詳細分析

    在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秒大,反之亦然,例如:

運行的結果是:1899-12-30 00:00:00

運行的結果是:2007-10-28 10:30:20
反過來以可以得到變量的值,例如:

運行的結果是:38349.932199
    COleDateTimeSpan類是用於對COleDateTime類的兩個時間的時間間隔的計算,COleDateTimeSpan類使用的成員變量COleDateTimeSpan::m_span是一個double類型是用於記錄兩個COleDateTime::m_dt的時間差,例如:

運行的結果是:365.000000
反過來也可以得到日期

運行的結果是: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內部的原形是:

    看到沒有,它返回的實際是個long類型,並不是一個double類型,所以在使用這幾個函數的時候計算兩個時間的間隔不要太大,特別是GetTotalSeconds( )函數,如計算兩個時間的間隔大於68年時就會溢出,所以我建議直接讀取COleDateTimeSpan::m_span變量的值,這是一個單位爲日的時間間隔,例如:

運行的結果是:-2085892096.000000
這個結果明顯是一個溢出,如果使用
str.Format("%f",ts.m_span*86400);
則會得到2209075200.000000。
    所以靈活使用COleDateTime類的m_dt變量和COleDateTimeSpan類的m_span變量操作會得到意想不到的收穫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章