日期及時間
MFC 支援數種不同的日期和時間處理方式:
支援自動化
DATE
數據類型。DATE
支援日期、時間和日期/時間值。COleDateTime
和COleDateTimeSpan
類別會封裝這項功能。 他們會使用自動化支援來與類別COleVariant
合作。一般用途的時間類別。
CTime
和CTimeSpan
類別會封裝大部分與 ANSI 標準時間連結庫相關聯的功能,其會在中time.h
宣告。支援系統時鐘。 使用 MFC 3.0 版,Win32
SYSTEMTIME
和FILETIME
資料類型的支援已新增至CTime
。
日期和時間:Automation 支援
類別 COleDateTime
提供一種方式來表示日期和時間資訊。 它提供比 類別更精細的粒度和更大的範圍 CTime
。 類別 COleDateTimeSpan
代表經過的時間,例如兩個 COleDateTime
對象之間的差異。
COleDateTime
和 COleDateTimeSpan
類別是設計來與類別搭配COleVariant
使用。 COleDateTime
和 COleDateTimeSpan
在 MFC 資料庫程式設計中也很有用,但每當您想要操作日期和時間值時,都可以使用它們。 雖然 類別 COleDateTime
的值範圍和數據粒度比 CTime
類別更精細,但每個物件 CTime
需要比 更多的儲存空間。 使用基礎 DATE 類型時,也有一些特殊考慮。 如需 實作 DATE
的詳細資訊,請參閱 DATE
類型。
COleDateTime
物件可用來表示介於 100 年 1 月 1 日到 9999 年 12 月 31 日之間的日期。 COleDateTime
對像是浮點值,其解析度大約為 1 毫秒。 COleDateTime
是以 MFC 檔中COleDateTime::operator DATE
定義的數據類型為基礎DATE
。 的實際實作 DATE
延伸超過這些界限。 實作 COleDateTime
會強制執行這些界限,以便更輕鬆地使用 類別。
COleDateTime
不支援 Julian 日期。 公曆假設可追溯到 100 年 1 月 1 日。
COleDateTime
會忽略日光節約時間 (DST)。 下列程式代碼範例會比較兩個計算跨越 DST 切換日期的時間範圍的方法:一個使用 CRT,另一個則使用 COleDateTime
。
第一個方法分別使用標準 C 型別結構和 tm
,將 兩個 CTime
對象 time1
和time2
設定為 4 月 5 日和 time_t
4 月 6 日。 程式代碼會顯示 time1
和 , time2
以及它們之間的時間範圍。
第二個方法會建立兩個 COleDateTime
物件 和 oletime2
,oletime1
並將其設定為與 time1
和 time2
相同的日期。 它會顯示 oletime1
和 oletime2
,以及它們之間的時間範圍。
CRT 正確計算 23 小時的差異。 COleDateTimeSpan
計算24小時的差異。
void CDTDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
time_t date1_t, date2_t;
tm date_tm;
date_tm.tm_hour = 12;
date_tm.tm_min = 0;
date_tm.tm_mon = 3;
date_tm.tm_sec = 0;
date_tm.tm_wday = 0; //Day of week (0-6; Sunday = 0)
date_tm.tm_yday = 0;
date_tm.tm_year = 97;
date_tm.tm_isdst = -1; //Positive if Daylight Saving Time is in effect;
//0 if Daylight Saving Time is not in effect;
//Negative if status of DST is unknown.
date_tm.tm_mday = 6;
date2_t = mktime(&date_tm);
date_tm.tm_mday = 5;
date_tm.tm_isdst = 0;
date1_t = mktime(&date_tm);
CTime time1(date1_t), time2(date2_t);
CTimeSpan ts = time2 - time1;
dc.TextOut(0, 0, CString(_T("CTime")));
dc.TextOut(0, 20, time1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
dc.TextOut(0, 40, time2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
dc.TextOut(0, 60, ts.Format(_T("%H:%M:%S and %D days")));
COleDateTime oletime1(date1_t), oletime2(date2_t);
COleDateTimeSpan olets = oletime2 - oletime1;
dc.TextOut(0, 120, CString(_T("COleDateTime")));
dc.TextOut(0, 140, oletime1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
dc.TextOut(0, 160, oletime2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
//Work-around bug in COleDateTime::Format("%D")
CString str;
str.Format(_T("%s and %d days"), (LPCTSTR)olets.Format(_T("%H:%M:%S")),
olets.GetDays());
dc.TextOut(0, 180, str);
}
取得目前時間
下列程式示範如何建立 COleDateTime
物件,並使用目前時間初始化它。
取得目前時間
建立
COleDateTime
物件。呼叫
GetCurrentTime
。COleDateTime timeNow; timeNow = COleDateTime::GetCurrentTime();
計算經過的時間
此程式示範如何計算兩個COleDateTime
COleDateTimeSpan
對象之間的差異,並取得結果。
若要計算經過的時間
建立兩個
COleDateTime
物件。將其中
COleDateTime
一個物件設定為目前時間。執行一些耗時的工作。
將另一個
COleDateTime
物件設定為目前時間。採用兩次之間的差異。
COleDateTime timeStart, timeEnd; timeStart = COleDateTime::GetCurrentTime(); // ... perform time-consuming task timeEnd = COleDateTime::GetCurrentTime(); COleDateTimeSpan spanElapsed = timeEnd - timeStart;
格式化時間
格式化時間
Format
使用 或 COleDateTimeSpan
的成員函式COleDateTime
,建立代表時間或經過時間的字元字串。
COleDateTime time(1970, 12, 18, 17, 30, 0);
// 18 December 1970, 5:30 PM
CString s = time.Format(VAR_DATEVALUEONLY);
// s contains the date formatted based on
// the current national language specifications
// (locale ID). The time portion is ignored for
// formatting purposes in this case.
如需詳細資訊,請參閱 COleVariant
類別。
日期和時間:資料庫支援
從 4.0 版開始,MFC 資料庫程式設計會使用 COleDateTime
和 COleDateTimeSpan
類別來表示日期和時間數據。 這些類別也用於自動化,衍生自 類別 COleVariant
。 它們提供比 和 CTime
CTimeSpan
更好的管理日期和時間數據支援。
日期和時間: SYSTEMTIME
支援
類別 COleDateTime
具有從 Win32 接受系統和檔案時間的建構函式。
Win32 FILETIME
結構會將時間表示為64位值。 它比 SYSTEMTIME
結構更方便內部儲存,以及 Win32 用來代表檔案建立時間的格式。 如需 結構 SYSTEMTIME
的相關信息,請參閱 SYSTEMTIME
。 如需 結構 FILETIME
的相關信息,請參閱 FILETIME
。