ctime函式
函式: ctime
功 能: 把日期和時間轉換為字元串
用 法: char *ctime(const time_t *time);
程式例:
註:若在linux下使用本函式,需要include <time.h>頭檔案
CTime類
CTime類的對象表示的時間是基於格林威治標準時間(GMT)的。CTimeSpan類的對象表示的是時間間隔。
CTime類一般不會被繼承使用。其對象的大小是8個位元組。
CTime表示的日期上限是2038年1月18日,下限是1970年1月1日 12:00:00 AM GMT。
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 <= : 比較兩個絕對時間,是否前一個小於等於後一個。
=====================================================================
C++中,CTime 與 CString轉換
CTime m_StartTime1 = CTime::GetCurrentTime();
CString csStartTime = m_StartTime1.Format( "%Y%m%d%H%M%S" );
一.將CString轉為CTime的幾種方法
CString timestr = "2000年04月05日";
int a,b,c ;
sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c);
CTime time(a,b,c,0,0,0);
--------or - ---------------------
CString s("2001-8-29 19:06:23");
int nYear, nMonth, nDate, nHour, nMin, nSec;
sscanf(s, "%d-%d-%d %d:%d:%d", &nYear, &nMonth, &nDate, &nHour, &nMin, &nSec);
CTime t(nYear, nMonth, nDate, nHour, nMin, nSec);
---- or ------------------------
CString timestr = "2000年04月05日";
int year,month,day;
BYTE tt[5];
//get year
memset(tt, 0, sizeof(tt));
tt[0] = timestr[0];
tt[1] = timestr[1];
tt[2] = timestr[2];
tt[3] = timestr[3];
year= atoi((char *)tt);
//get month
memset(tt, 0, sizeof(tt));
tt[0] = timestr[6];
tt[1] = timestr[7];
month = atoi((char *)tt);
//get day
memset(tt, 0, sizeof(tt));
tt[0] = timestr[10];
tt[1] = timestr[11];
day = atoi((char *)tt);
CTime time(year,month,day,0,0,0);
從上面來看,很明顯使用sscanf()函式的優勢.
二.將CTIme轉換為CString的方法:
CTime tmSCan = CTime::GetCurrentTime();
CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");
這樣得到的 日期 時間字元串就是以"2006-11-27 23:30:59"的格式.這是不是很方便呢?
//取得CTime中的 日期
CString cstrDate = tmScan.Format("%Y-%m-%d");
//取得CTime中的時間
CString cstrTime = tmScan.Format("%H:%M-%S");
sprintf還有個不錯的表妹:strftime,專門用於格式化時間字元串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要調用者指定緩衝區的最大長度,可能是為了在出現問題時可以推卸責任吧。這裡舉個例子:
更多更好的sprintf()函式說明參考:《spirntf,你知道多少?》
time_t t = time(0);
//產生"YYYY-MM-DD hh:mm:ss"格式的字元串。
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,這一對由於從面向對象哪裡得到了贊助,用以寫出的代碼更覺優雅