分享方式:


日期及時間

MFC 支援數種不同的日期和時間處理方式:

  • 支援自動化 DATE 資料類型 DATE 支援日期、時間和日期/時間值。 COleDateTimeCOleDateTimeSpan 類別會封裝這項功能。 他們會使用自動化支援來與 類別 COleVariant 合作。

  • 一般用途的時間類別。 CTimeCTimeSpan 類別會封裝大部分與 ANSI 標準時間程式庫相關聯的功能,其會在 中 time.h 宣告。

  • 支援系統時鐘。 使用 MFC 3.0 版,Win32 SYSTEMTIMEFILETIME 資料類型的支援已新增至 CTime

日期和時間:Automation 支援

類別 COleDateTime 提供一種方式來表示日期和時間資訊。 它提供比 類別更精細的細微性和更大的範圍 CTime 。 類別 COleDateTimeSpan 代表經過的時間,例如兩個 COleDateTime 物件之間的差異。

COleDateTimeCOleDateTimeSpan 類別是設計來與 類別搭配 COleVariant 使用。 COleDateTimeCOleDateTimeSpan 在 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 物件 time1time2 設定為 4 月 5 日和 time_t 4 月 6 日。 程式碼會顯示 time1 和 , time2 以及它們之間的時間範圍。

第二個方法會建立兩個 COleDateTime 物件 和 oletime2oletime1 並將其設定為與 time1time2 相同的日期。 它會顯示 oletime1oletime2 ,以及它們之間的時間範圍。

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 物件,並使用目前時間初始化它。

取得目前時間

  1. 建立 COleDateTime 物件。

  2. 呼叫 GetCurrentTime

    COleDateTime timeNow;
    timeNow = COleDateTime::GetCurrentTime();   
    

計算經過的時間

此程式示範如何計算兩個 COleDateTimeCOleDateTimeSpan 物件之間的差異,並取得結果。

若要計算經過的時間

  1. 建立兩個 COleDateTime 物件。

  2. 將其中 COleDateTime 一個 物件設定為目前時間。

  3. 執行一些耗時的工作。

  4. 將另一個 COleDateTime 物件設定為目前時間。

  5. 採用兩次之間的差異。

    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 資料庫程式設計會使用 COleDateTimeCOleDateTimeSpan 類別來表示日期和時間資料。 這些類別也用於自動化,衍生自 類別 COleVariant 。 它們提供比 和 CTimeCTimeSpan 更好的管理日期和時間資料支援。

日期和時間: SYSTEMTIME 支援

類別 COleDateTime 具有從 Win32 接受系統和檔案時間的建構函式。

Win32 FILETIME 結構會將時程表示為 64 位值。 它比 SYSTEMTIME 結構更方便內部儲存,以及 Win32 用來代表檔案建立時間的格式。 如需 結構 SYSTEMTIME 的相關資訊,請參閱 SYSTEMTIME 。 如需 結構 FILETIME 的相關資訊,請參閱 FILETIME

另請參閱

概念
一般 MFC 主題