VS2010/MFC程式設計入門之四十三(MFC常用類:CTime類和CTimeSpan類)
轉載: http://www.jizhuomi.com/software/230.html
上一節中雞啄米講了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++程式碼- #include "atltime.h"
- #include <iostream>
- using namespace std;
3. 修改main函式如下:
C++程式碼- int _tmain(int argc, _TCHAR* argv[])
- {
- CString strTime; // 用於將CTime物件格式化為字串
- // 獲取當前時間並儲存到curTime
- CTime curTime = CTime::GetCurrentTime();
- int nYear = curTime.GetYear(); // 獲取當前年份
- int nMonth = curTime.GetMonth(); // 獲取當前月份
- int nDay = curTime.GetDay(); // 獲取當前日期
- int nHour = curTime.GetHour(); // 獲取當前小時時間
- int nMin = curTime.GetMinute(); // 獲取當前分鐘時間
- int nSec = curTime.GetSecond(); // 獲取當前秒時間
- // 輸出當前時間
- cout<<"當前時間:"<<endl;
- cout<<nYear<<"年"<<nMonth<<"月"<<nDay<<"日"<<nHour<<"時"<<nMin<<"分"<<nSec<<"秒"<<endl;
- // 為計算時間差,設定一個起始時間並輸出
- CTime startTime = CTime(2010,7,3,10,20,30);
- cout<<"起始時間:"<<endl;
- cout<<startTime.GetYear()<<"年"<<startTime.GetMonth()<<"月"<<startTime.GetDay()<<"日"<<startTime.GetHour()<<"時"<<startTime.GetMinute()<<"分"<<startTime.GetSecond()<<"秒"<<endl;
- // 計算時間差
- CTimeSpan timeSpan;
- timeSpan = curTime - startTime;
- cout<<"兩時間相差:"<<endl;
- cout<<timeSpan.GetDays()<<"天"<<timeSpan.GetHours()<<"小時"<<timeSpan.GetMinutes()<<"分"<<timeSpan.GetSeconds()<<"秒"<<endl;
- cout<<"總小時數:"<<timeSpan.GetTotalHours()<<"小時"<<endl;
- cout<<"總分鐘數:"<<timeSpan.GetTotalMinutes()<<"分"<<endl;
- cout<<"總秒數:"<<timeSpan.GetTotalSeconds()<<"秒"<<endl;
- // 將當前時間curTime物件格式化為字串
- strTime = curTime.Format(_T("%Y-%m-%d %H:%M:%S"));
- // 輸出格式化字串,由於字串使用Unicode字元,所以要使用wcout輸出
- wcout<<(LPCTSTR)strTime<<endl;
- return 0;
- }
其中的註釋已經解釋的比較清楚,相信大家都能夠理解。
4. 執行程式,效果如下:
好了,有關CTime類和CTimeSpan類的相關內容就講到這裡了,如果大家覺得還有必要了解更加詳細的知識可以參閱MSDN文件。最後雞啄米謝謝大家一直以來的支援。