VS2010/MFC編程入門之四十三(MFC常用類:CTime類和CTimeSpan類)

上一節中雞啄米講了MFC常用類CString類的用法,本節繼續講另外兩個MFC常用類-日期和時間類CTime類和CTimeSpan類。

       日期和時間類簡介

       CTime類的對象表示的時間是基於格林威治標準時間(GMT)的。CTimeSpan類的對象表示的是時間間隔。

       CTime類和CTimeSpan類一般不會被繼承使用。兩者對象的大小都是8個字節。

       CTime表示的日期上限是3000年12月31日,下限是1970年1月1日 12:00:00 AM GMT。

       CTime類的主要成員函數

       下面列出CTime類的主要成員函數,並加以講解。

       CTime();

       構造一個未經初始化的CTime對象。此構造函數使我們可以定義一個CTime對象的數組,在使用數組前需要以有效的時間值爲其初始化。

       CTime(__time64_t time);

       以一個__time64_t(注意:最前面的下劃線有兩條)類型的數據來構造一個CTime對象。參數time是一個__time64_t類型的值,表示自GMT時間1970年1月1日零點以來的秒數,這裏要注意的是,參數time代表的時間會轉換爲本地時間保存到構造的CTime對象中。例如,我們傳遞參數0構造一個CTime對象,然後調用CTime對象的GetHour成員函數將返回8,因爲參數0代表的GMT時間轉換爲北京時間後爲1970年1月1日 8:00:00。

CTime(
   int nYear,
   int nMonth,
   int nDay,
   int nHour,
   int nMin,
   int nSec,
   int nDST = -1
);

       以本地時間的年、月、日、小時、分鐘、秒等幾個時間分量構造CTime對象。參數nYear、nMonth、nDay、nHour、nMin、nSec分別表示年、月、日、小時、分鐘、秒,取值範圍如下:

時間分量 取值範圍
nYear 1970-3000
nMonth 1-12
nDay 1-31
nHour 0-23
nMin 0-59
nSec 0-59

       參數nDST指定是否實行夏令時,爲0時表示實行標準時間,爲正數時表示實行夏令時,爲負數時由系統自動計算實行的是標準時間還是夏令時。

       CTime(const SYSTEMTIME& st,int nDST = - 1) ;

       以一個SYSTEMTIME結構體變量來構造CTime對象。SYSTEMTIME結構體也是我們對日期時間的常用表示方式。參數st爲以本地時間表示的SYSTEMTIME對象,參數nDST同上。

       static CTime WINAPI GetCurrentTime( );

       獲取系統當前日期和時間。返回表示當前日期和時間的CTime對象。

       int GetYear( ) const;

       獲取CTime對象表示時間的年份。範圍從1970年1月1日到2038年(包括2038年)1月18日。

       int GetMonth( ) const;

       獲取CTime對象表示時間的月份。範圍爲1到12。

       int GetDay( ) const;

       獲取CTime對象表示時間的日期。範圍爲1到31。

       int GetHour( ) const;

       獲取CTime對象表示時間的小時。範圍爲0到23。

       int GetMinute( ) const;

       獲取CTime對象表示時間的分鐘。範圍爲0到59。     

       int GetSecond( ) const;

       獲取CTime對象表示時間的秒。範圍爲0到59。

       int GetDayOfWeek( ) const;

       此函數的返回值表示CTime對象代表的是星期幾,1表示是週日,2表示是週一,以此類推。

       CString Format(LPCTSTR pszFormat) const;

       將CTime對象中的時間信息格式化爲字符串。參數pszFormat是格式化字符串,與printf中的格式化字符串類似,格式化字符串中帶有%前綴的格式碼將會被相應的CTime時間分量代替,而其他字符會原封不動的拷貝到返回字符串中。格式碼及含義如下:

%a:周的英文縮寫形式。
%A:周的英文全名形式。
%b: 月的英文縮寫形式。
%B:月的英文全名形式。
%c: 完整的日期和時間。
%d:十進制形式的日期(01-31)。
%H:24小時制的小時(00-23)。
%I: 12小時制的小時(00-11)。
%j: 十進制表示的一年中的第幾天(001-366)。
%m: 月的十進制表示(01-12)。
%M:十進制表示的分鐘(00-59)。
%p: 12小時制的上下午標示(AM/PM)。
%S: 十進制表示的秒(00-59)。
%U: 一年中的第幾個星期(00-51),星期日是一週的第一天。
%W: 一年中的第幾個星期(00-51),星期一是一週的第一天。
%w: 十進制表示的星期幾(0-6)。
%Y: 十進制表示的年。

       CTime operator +(CTimeSpan timeSpan) const;

       將CTime對象和CTimeSpan對象相加,返回一個CTime對象。實際意義就是在一個時間的基礎上推後一個時間間隔,得到一個新的時間。

       CTime operator -(CTimeSpan timeSpan) const;

       將CTime對象和一個CTimeSpan相減,返回一個CTime對象。實際意義就是在一個時間的基礎上提前一個時間間隔,得到一個新的時間。

       CTimeSpan operator -(CTime time) const;

       將該CTime對象和另一個CTime對象相減,返回一個CTimeSpan對象。實際意義就是計算兩個時間點的間隔,得到一個CTimeSpan對象。

       CTime& operator +=(CTimeSpan span);

       爲該CTime對象增加一個span表示的時間間隔。

       CTime& operator -=(CTimeSpan span);

       爲該CTime對象減去一個span表示的時間間隔。

       CTime& operator =(__time64_t time);

       爲該CTime對象賦予一個新的時間值。

       簡單說下剩下的幾個重載i運算符:

       operator == :    比較兩個絕對時間是否相等。
       operator != :    比較兩個絕對時間是否不相等。
       operator > :    比較兩個絕對時間,是否前一個大於後一個。
       operator < :    比較兩個絕對時間,是否前一個小於後一個。
       operator >=    : 比較兩個絕對時間,是否前一個大於等於後一個。
       operator <=    : 比較兩個絕對時間,是否前一個小於等於後一個。

       CTimeSpan類的主要成員函數

       前面介紹了CTime類的成員函數,再來看CTimeSpan類的成員函數就比較容易了,這裏只做簡單介紹。

       CTimeSpan( );

       構造一個未經初始化的CTimeSpan對象。

       CTimeSpan(__time64_t time);

       以一個__time64_t類型的數據來構造CTimeSpan對象,參數time的含義上面CTime(__time64_t time)的講解。

CTimeSpan(
   LONG lDays,
   int nHours,
   int nMins,
   int nSecs
);

       以天、小時、分鐘、秒等時間分量來構造CTimeSpan對象。每個時間分量的取值範圍如下:

時間分量 取值範圍
lDays 0-25000(大約)
nHours 0-23
nMins 0-59
nSecs 0-59

       GetDays():獲得CTimeSpan類對象中包含的完整的天數。

       GetHours():獲得當天的小時數,取值範圍爲-23到23。

       GetTotalHours():獲得CTimeSpan類對象中包含的完整的小時數。

       GetMinutes():獲得當前小時包含的分數,取值範圍爲-59到59。

       GetTotalMinutes():獲得CTimeSpan類對象中包含的完整的分數。

       GetSeconds():獲得當前分鐘包含的秒數,取值範圍爲-59到59。

       GetTotalSeconds():獲得CTimeSpan類對象中包含的完整的秒數。

       CString Format(LPCTSTR pszFormat) const;

       將一個CTimeSpan對象格式化爲字符串。使用方式與CTime::Format類似,格式碼及含義如下:

       %D:CTimeSpan對象中的總天數;
       %H:不足整天的小時數;
       %M:不足1小時的分鐘數;
       %S:不足1分鐘的秒數;
       %%:百分號。

       另外,CTimeSpan類也重載了運算符“=”,“+”,“-”,“+=”,“-=”,“==”,“!=”,“<”,“>”,“<=”,“>=”,用於CTimeSpan對象的賦值、加減運算及兩個CTimeSpan對象的比較。

       CTime類和CTimeSpan類的應用實例

       雞啄米在下面將爲大家演示如何得到當前時間、計算兩個時間的時間差以及CTime對象怎樣格式化爲字符串等。具體步驟如下:

       1. 創建一個Win32 Console Application工程,Name設爲“Example43”。

       2. 因爲要使用到CTime類、CTimeSpan類和cout輸出流,所以在Example43.cpp文件中包含相應的頭文件:

C++代碼
  1. #include "atltime.h"   
  2. #include <iostream>   
  3. using namespace std;  

        3. 修改main函數如下:

C++代碼
  1. int _tmain(int argc, _TCHAR* argv[])   
  2. {   
  3.     CString strTime;  // 用於將CTime對象格式化爲字符串   
  4.     // 獲取當前時間並保存到curTime   
  5.     CTime curTime = CTime::GetCurrentTime();   
  6.   
  7.     int nYear = curTime.GetYear();  // 獲取當前年份   
  8.     int nMonth = curTime.GetMonth(); // 獲取當前月份   
  9.     int nDay = curTime.GetDay();   // 獲取當前日期   
  10.     int nHour = curTime.GetHour();  // 獲取當前小時時間   
  11.     int nMin = curTime.GetMinute(); // 獲取當前分鐘時間   
  12.     int nSec = curTime.GetSecond(); // 獲取當前秒時間   
  13.   
  14.     // 輸出當前時間   
  15.     cout<<"當前時間:"<<endl;   
  16.     cout<<nYear<<"年"<<nMonth<<"月"<<nDay<<"日"<<nHour<<"時"<<nMin<<"分"<<nSec<<"秒"<<endl;   
  17.   
  18.     // 爲計算時間差,設定一個起始時間並輸出   
  19.     CTime startTime = CTime(2010,7,3,10,20,30);   
  20.     cout<<"起始時間:"<<endl;   
  21.     cout<<startTime.GetYear()<<"年"<<startTime.GetMonth()<<"月"<<startTime.GetDay()<<"日"<<startTime.GetHour()<<"時"<<startTime.GetMinute()<<"分"<<startTime.GetSecond()<<"秒"<<endl;   
  22.   
  23.     // 計算時間差   
  24.     CTimeSpan timeSpan;   
  25.     timeSpan = curTime - startTime;   
  26.     cout<<"兩時間相差:"<<endl;   
  27.     cout<<timeSpan.GetDays()<<"天"<<timeSpan.GetHours()<<"小時"<<timeSpan.GetMinutes()<<"分"<<timeSpan.GetSeconds()<<"秒"<<endl;   
  28.     cout<<"總小時數:"<<timeSpan.GetTotalHours()<<"小時"<<endl;   
  29.     cout<<"總分鐘數:"<<timeSpan.GetTotalMinutes()<<"分"<<endl;   
  30.     cout<<"總秒數:"<<timeSpan.GetTotalSeconds()<<"秒"<<endl;      
  31.   
  32.     // 將當前時間curTime對象格式化爲字符串   
  33.     strTime = curTime.Format(_T("%Y-%m-%d %H:%M:%S"));   
  34.     // 輸出格式化字符串,由於字符串使用Unicode字符,所以要使用wcout輸出   
  35.     wcout<<(LPCTSTR)strTime<<endl;   
  36.   
  37.     return 0;   
  38. }  

       其中的註釋已經解釋的比較清楚,相信大家都能夠理解。

       4. 運行程序,效果如下:

CTime類和CTimeSpan類的實例

       好了,有關CTime類和CTimeSpan類的相關內容就講到這裏了,如果大家覺得還有必要了解更加詳細的知識可以參閱MSDN文檔。最後雞啄米謝謝大家一直以來的支持。




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