使用COleDateTime類
1) 獲取當前時間。
CTime time;
time = CTime::GetCurrentTime();
2) 獲取時間元素。
int year = time.GetYear() ;
int month = time.GetMonth();
int day = time.GetDay();
int hour = time.GetHour();
int minute = time.GetMinute();
int second = time.GetSecond();
int DayOfWeek = time.GetDayOfWeek() ;
3) 獲取時間間隔。
CTimeSpan timespan(0,0,1,0); // days,hours,minutes,seconds
timespan = CTime::GetCurrentTime() - time;
4) 把時間轉換爲字符串。
CString sDate,sTime,sElapsed Time ;
sDate = time.Format("%m/%d/%y"); //ex: 12/10/98
sTime = time.Format("%H:%M:%S"); //ex: 9:12:02
sElapsed Time = timespan.Format("%D:%H:%M:%S"); // %D is total elapsed days
5) 把字符串轉換爲時間。
CString sDateTime;
int nYear, nMonth, nDate, nHour, nMin, nSec;
sscanf(sDateTime, "%d-%d-%d %d:%d:%d", &nYear, &nMonth, &nDate, &nHour, &nMin, &nSec);
CTime sTime(nYear, nMonth, nDate, nHour, nMin, nSec);
要想知道更多的時間格式,參見MFC文檔中的strftimehtml
使用COleDateTime類
1) 得到一年中的某一天。
COleDateTime datetime;
datetime = COleDateTime::GetCurrentTime();
int DayOfYear = datetime.GetDayOfYear();
2) 從文本串中讀取時間。
COleDateTime datetime;
datetime.ParseDateTime("12:12:23 27 January 93");
3) 獲取時間間隔。
//比方計算日期差
COleDateTime begin_date(1970, 1, 1, 0, 0, 0);
COleDateTime end_date(1990, 1, 1, 0, 0, 0);
COleDateTimeSpan timeSpan; //計算時間差
timeSpan = end_date - begin_date;
long expi_date = timeSpan.GetDays();sql
說明
■ CTime和COleDateTime具備幾乎一樣的功能。然而,COleDateTime容許用戶得到一年中的某一天(建立Julian日期的一種好方法),以及分析一個時間文本串。
■ 與CTime相比, COleDateTime的優勢在於它支持DWORD變量。COleDateTime使用的位數是雙浮點的兩倍,既然CTime只是簡單地計算從1970年1月1日以後通過的秒數,因此到了2037年它將達到4294967295,從而不能再使用。相反,COleDateTime是一個
浮點數,它表示是從1900年12月30號以後的天數(小時是天的小數部分),幾千年以內不會溢出。數據庫
-------------------------------------------------------------------------------------------------------------------------------函數
CTime time = CTime::GetCurrentTime();spa int year = time.GetYear(); //返回年code int mouth = time.GetMouth(); //返回月份orm int date = time.GetDays(); // 返回日數htm int hour = time.GetHours(); // 返回小時數(-23至23之間) int sec = time.GetSeconds(); // 返回秒數(-59至59之間)事件 如下是轉載的:CTime以及其它時間差 1、DateTimePicker控件 引用一個DateTimePicker控件,關聯變量m_date爲DateTimeCtrl類型,而後在響應事件中加入以下代碼: CTime tm; 就能夠獲取了...可是不知爲什麼這個還和Vc的版本問題有關,開始時候我用的版本老是出錯,或者srtDate爲空,或者不是用戶選擇的日期,後來換了一個VC版本就能獲得正確的數據了... 另外若是關聯一個CTime類型的變量也能解決上面的問題,可是初始化的日期是1970-01-01而上面方法中初始化的日期是當前日期...因此根據用戶須要的設定能夠選擇任何一種方法進行解決... 2、CTimeSpan獲取時間差 要獲取兩個時間差,如兩個CTime的時間差,可使用MFC中的CTimeSpan類。 CTime time1 = CTime::GetCurrentTime(); ...其它代碼... CTime time2 = CTime::GetCurrentTime(); // 兩個CTime相減獲得CTimeSpan CTimeSpan timeSpan = time2 - time1; // 獲得總的秒數 int nTSeconds = timeSpan.GetTotalSeconds();
注意GetTotalSeconds與GetSeconds的區別:GetTotalSeconds返回總的秒數,GetSeconds返回老是小於60,如:若是時間通過了100秒, GetTotalSeconds返回100,而GetSeconds返回40,由於有60秒轉爲一分鐘了,同時使用GetMinutes會返回1,即1分40秒。 GetDays(); // 返回日數 GetHours(); // 返回小時數(-23至23之間) GetTotalHours(); // 返回總的小時數 GetMinutes(); // 返回分鐘數(-59至59之間) GetTotalMinutes(); // 返回總的分鐘數 GetSeconds(); // 返回秒數(-59至59之間) GetTotalSeconds(); // 返回總的秒數 3、CTime總結
1.初始化 m_begintime=CTime(2004,1,1,0,0,0,-1);//參數依次爲year,month,day,hour,minite,second m_endtime =CTime::GetCurrentTime();//當前時間 2.日期比較 CTimeSpan span; span=time1-time2; 獲得兩時間的間隔. 能夠取得span.GetHours().等 3.access數據庫查詢 使用DateDiff()函數,具體參照access幫助 CString timesql; timesql.Format(" Where DateDiff('d',%s,'%s')<=0","日期",m_begintime.Format("%Y-%m-%d")); 4讀取日期字段(odbc) CDBVariant var; recset.GetFieldValue(i,var); s.Format("%d-%d-%d",(var.m_pdate)->year,(var.m_pdate)->month, (var.m_pdate)->day); 5.CTime轉換爲CString 例: m_begintime.Format("%Y-%m-%d");//2004-10-03 6.CString轉換爲CTime //s="2004-10-5" int first=s.Find('-'); int second=s.Find('-',first+1); int year=atoi(s.Left(4)); int month=atoi(s.Mid(first+1,second-first+1)); int day=atoi(s.Mid(second+1,s.GetLength()-second-1)); CTime temp(year,month,day,0,0,0); 7.判斷CString是否表示的正確日期格式 //判斷是否爲2004-01-13 ch 可表明其餘分隔符 bool IsDate(CString str,char ch) { if(str.IsEmpty()) return false; //日期分段 int first=str.Find(ch); int second=str.Find(ch,first+1); int year=atoi(str.Left(4)); int month=atoi(str.Mid(first+1,second-first+1)); int day=atoi(str.Mid(second+1,str.GetLength()-second-1)); //判斷 if (year < 2000 || year >= 2010) { return false; } else if (month< 1 || month >12) { return false; } else if (day< 1 || day > 31) { return false; } else if (month == 4 || month == 6 || month == 9 || month == 11) { if(day > 30) { return false; } else { return true; } } else if (month == '2') { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { if (day>29) { return false; } else { return true; } } else if (day>28) { return false; } return true; } else { return true; } } 4、 在MFC中操做時間的類主要有兩對:CTime和CTimeSpan與COleDateTime和COleDateTimeSpan,CTime和CTimeSpan主要封裝了ANSI time_t和關於time_t的Run-Time庫的主要函數,CTime裏面使用的成員變量是time_t類型,該類型是個long型,因爲long類型的緣由,因此該類只能處理4294967296秒約68年的數據,因此用CTime只能處理1970年到2038年的日期。 幸虧,MFC同時提供了COleDateTime和COleDateTimeSpan類,使用該兩個類徹底能夠代替CTime和CTimeSpan,COleDateTime和COleDateTimeSpan類所使用的成員變量是DATE類型,該類型是個double類型,並且使用的單位是日,因此能夠處理從100年1月1日到9999年12月31日的日期時間,COleDateTime類的日期計算主要是操做公有成員變量COleDateTime::m_dt,該變量是DATE即double類型,該變量是爲零時是1899年12月30日0時0分0秒,大於零時的日期比1899年12月30日0時0分0秒大,反之亦然,例如: COleDateTime t; t.m_dt=0; AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S")); 運行的結果是:1899-12-30 00:00:00 COleDateTime t; t.m_dt=39444.437731; AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S")); 運行的結果是:2007-10-28 10:30:20 反過來以能夠獲得變量的值,例如: COleDateTime t(2004,12,28,22,22,22); CString str; str.Format("%f",t.m_dt); AfxMessageBox(str); 運行的結果是:38349.932199 COleDateTimeSpan類是用於對COleDateTime類的兩個時間的時間間隔的計算,COleDateTimeSpan類使用的成員變量COleDateTimeSpan::m_span是一個double類型是用於記錄兩個COleDateTime::m_dt的時間差,例如: COleDateTime t1(2006,1,1,0,0,0); COleDateTime t2(2007,1,1,0,0,0); COleDateTimeSpan ts=t2-t1; CString str; str.Format("%f",ts.m_span); AfxMessageBox(str); 運行的結果是:365.000000 反過來也能夠獲得日期 COleDateTime t1(2006,1,1,0,0,0); COleDateTimeSpan ts; ts.m_span=400.0; COleDateTime t2=t1+ts; AfxMessageBox(t2.Format("%c")); 運行的結果是:02/05/07 00:00:00 但是在使用COleDateTimeSpan類中如下的幾個函數可要當心,這不知道是否是MFC的一個Bug, double GetTotalDays( ) const; double GetTotalHours( ) const; double GetTotalMinutes( ) const; double GetTotalSeconds( ) const; 幾個函數的返回值都是double類型 可是,如double GetTotalSeconds( ) const;在MFC內部的原形是: _AFXDISP_INLINE double COleDateTimeSpan::GetTotalSeconds() const { ASSERT(GetStatus() == valid); long lReturns = (long)(m_span * 24 * 60 * 60 + AFX_OLE_DATETIME_HALFSECOND); return lReturns; } 看到沒有,它返回的實際是個long類型,並非一個double類型,因此在使用這幾個函數的時候計算兩個時間的間隔不要太大,特別是GetTotalSeconds( )函數,如計算兩個時間的間隔大於68年時就會溢出,因此我建議直接讀取COleDateTimeSpan::m_span變量的值,這是一個單位爲日的時間間隔,例如: COleDateTime t1(2000,1,1,0,0,0); COleDateTime t2(2070,1,1,0,0,0); COleDateTimeSpan ts=t2-t1; CString str; str.Format("%f",ts.GetTotalSeconds()); AfxMessageBox(str); 運行的結果是:-2085892096.000000 這個結果明顯是一個溢出,若是使用 str.Format("%f",ts.m_span*86400); 則會獲得2209075200.000000。 因此靈活使用COleDateTime類的m_dt變量和COleDateTimeSpan類的m_span變量操做會獲得意想不到的收穫
|