MFC 使用datetimepicker获取时间
?
CTime time = CTime::GetCurrentTime();
int year = time.GetYear(); //返回年
int mouth = time.GetMouth(); //返回月份
int date = time.GetDays(); // 返回日數(shù)
int hour = time.GetHours(); // 返回小時(shí)數(shù)(-23至23之間)
int min = time.GetMinutes(); // 返回分鐘數(shù)(-59至59之間)
int sec = time.GetSeconds(); // 返回秒數(shù)(-59至59之間)
以下是轉(zhuǎn)載的:CTime以及其它時(shí)間差
一、DateTimePicker控件
引用一個(gè)DateTimePicker控件,關(guān)聯(lián)變量m_date為DateTimeCtrl類型,然后在響應(yīng)事件中加入如下代碼:
CTime tm;
m_date.GetTime(tm);
CString strDate=tm.Format("%Y-%m-%d");
就可以獲取了...但是不知為何這個(gè)還和Vc的版本問題有關(guān),開始時(shí)候我用的版本總是出錯(cuò),或者srtDate為空,或者不是用戶選擇的日期,后來換了一個(gè)VC版本就能得到正確的數(shù)據(jù)了...
另外如果關(guān)聯(lián)一個(gè)CTime類型的變量也能解決上面的問題,但是初始化的日期是1970-01-01而上面方法中初始化的日期是當(dāng)前日期...所以根據(jù)用戶需要的設(shè)定可以選擇任何一種方法進(jìn)行解決...
========================
實(shí)際上,只需要添加 datetimepicker控件的下面這樣一個(gè)響應(yīng)函數(shù)就可以解決。
void C****Dlg::OnKillfocusDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
?// TODO: Add your control notification handler code here
?UpdateData(TRUE);
?*pResult = 0;
}
========================
二、CTimeSpan獲取時(shí)間差
要獲取兩個(gè)時(shí)間差,如兩個(gè)CTime的時(shí)間差,可以使用MFC中的CTimeSpan類。
CTime time1 = CTime::GetCurrentTime(); ...其它代碼... CTime time2 = CTime::GetCurrentTime(); // 兩個(gè)CTime相減得到CTimeSpan CTimeSpan timeSpan = time2 - time1; // 得到總的秒數(shù) int nTSeconds = timeSpan.GetTotalSeconds();注意GetTotalSeconds與GetSeconds的區(qū)別:GetTotalSeconds返回總的秒數(shù),GetSeconds返回總是小于60,如:如果時(shí)間經(jīng)過了100秒, GetTotalSeconds返回100,而GetSeconds返回40,因?yàn)橛?0秒轉(zhuǎn)為一分鐘了,同時(shí)使用GetMinutes會(huì)返回1,即1分40秒。
其它類似函數(shù):
1.初始化
m_begintime=CTime(2004,1,1,0,0,0,-1);//參數(shù)依次為year,month,day,hour,minite,second
m_endtime =CTime::GetCurrentTime();//當(dāng)前時(shí)間
2.日期比較
CTimeSpan span;
span=time1-time2;
得到兩時(shí)間的間隔.
可以取得span.GetHours().等
3.access數(shù)據(jù)庫查詢
使用DateDiff()函數(shù),具體參照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轉(zhuǎn)換為CString
例:
m_begintime.Format("%Y-%m-%d");//2004-10-03
6.CString轉(zhuǎn)換為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;
}
}
四、
在MFC中操作時(shí)間的類主要有兩對(duì):CTime和CTimeSpan與COleDateTime和COleDateTimeSpan,CTime和CTimeSpan主要封裝了ANSI time_t和關(guān)于time_t的Run-Time庫的主要函數(shù),CTime里面使用的成員變量是time_t類型,該類型是個(gè)long型,由于long類型的原因,所以該類只能處理4294967296秒約68年的數(shù)據(jù),所以用CTime只能處理1970年到2038年的日期。
幸好,MFC同時(shí)提供了COleDateTime和COleDateTimeSpan類,使用該兩個(gè)類完全可以代替CTime和CTimeSpan,COleDateTime和COleDateTimeSpan類所使用的成員變量是DATE類型,該類型是個(gè)double類型,而且使用的單位是日,所以可以處理從100年1月1日到9999年12月31日的日期時(shí)間,COleDateTime類的日期計(jì)算主要是操作公有成員變量COleDateTime::m_dt,該變量是DATE即double類型,該變量是為零時(shí)是1899年12月30日0時(shí)0分0秒,大于零時(shí)的日期比1899年12月30日0時(shí)0分0秒大,反之亦然,例如:
COleDateTime t;
t.m_dt=0;
AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S"));
運(yùn)行的結(jié)果是:1899-12-30 00:00:00
COleDateTime t;
t.m_dt=39444.437731;
AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S"));
運(yùn)行的結(jié)果是:2007-10-28 10:30:20
反過來以可以得到變量的值,例如:
COleDateTime t(2004,12,28,22,22,22);
CString str;
str.Format("%f",t.m_dt);
AfxMessageBox(str);
運(yùn)行的結(jié)果是:38349.932199
COleDateTimeSpan類是用于對(duì)COleDateTime類的兩個(gè)時(shí)間的時(shí)間間隔的計(jì)算,COleDateTimeSpan類使用的成員變量COleDateTimeSpan::m_span是一個(gè)double類型是用于記錄兩個(gè)COleDateTime::m_dt的時(shí)間差,例如:
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);
運(yùn)行的結(jié)果是: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"));
運(yùn)行的結(jié)果是:02/05/07 00:00:00
可是在使用COleDateTimeSpan類中以下的幾個(gè)函數(shù)可要小心,這不知道是不是MFC的一個(gè)Bug,
double GetTotalDays( ) const;
double GetTotalHours( ) const;
double GetTotalMinutes( ) const;
double GetTotalSeconds( ) const;
幾個(gè)函數(shù)的返回值都是double類型
但是,如double GetTotalSeconds( ) const;在MFC內(nèi)部的原形是:
_AFXDISP_INLINE double COleDateTimeSpan::GetTotalSeconds() const
{ ASSERT(GetStatus() == valid);
long lReturns = (long)(m_span * 24 * 60 * 60 + AFX_OLE_DATETIME_HALFSECOND);
return lReturns;
}
看到?jīng)]有,它返回的實(shí)際是個(gè)long類型,并不是一個(gè)double類型,所以在使用這幾個(gè)函數(shù)的時(shí)候計(jì)算兩個(gè)時(shí)間的間隔不要太大,特別是GetTotalSeconds( )函數(shù),如計(jì)算兩個(gè)時(shí)間的間隔大于68年時(shí)就會(huì)溢出,所以我建議直接讀取COleDateTimeSpan::m_span變量的值,這是一個(gè)單位為日的時(shí)間間隔,例如:
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);
運(yùn)行的結(jié)果是:-2085892096.000000
這個(gè)結(jié)果明顯是一個(gè)溢出,如果使用
str.Format("%f",ts.m_span*86400);
則會(huì)得到2209075200.000000。
所以靈活使用COleDateTime類的m_dt變量和COleDateTimeSpan類的m_span變量操作會(huì)得到意想不到的收獲
?
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/wangicter/archive/2011/03/17/4767488.html
總結(jié)
以上是生活随笔為你收集整理的MFC 使用datetimepicker获取时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT精英养生之道,有多少人能做到?
- 下一篇: 线程创建后,立刻调用CloseHandl