MFC获取系统当前时间
1.使用CTime类
CString str; //获取系统时间
CTime tm; tm=CTime::GetCurrentTime();
str=tm.Format("现在时间是%Y年%m月%d日 %X");
MessageBox(str,NULL,MB_OK);
2: 得到系统时间日期(使用GetLocalTime)
SYSTEMTIME st;
CString strDate,strTime;
GetLocalTime(&st);
strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);
strTime.Format("%2d:%2d:%2d",st.wHour,st.wMinute,st.wSecond);
/////////////////////////////////////////////////////////
CTime类
1.构造和初始化CTime类对象
CTime类有下列构造函数:
CTime( );
CTime( const CTime& timeSrc );
CTime( time_t time );
CTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST = -1 );
CTime( WORD wDosDate, WORD wDosTime, int nDST = -1 );
CTime( const SYSTEMTIME& sysTime, int nDST = -1 );
CTime( const FILETIME& fileTime, int nDST = -1 );
说明:以不同的方式构造一个CTime对象。可以用一个已经存在的CTime对象或一个time_t(在time.h中被定义为long)类型变量来构造和初始化CTime对象,也可以用年、月、日、小时、分、秒来构造和初始化CTime对象,还可以用SYSTEMTIME、FILETIME结构来构造和初始化CTime对象。SYSTEMTIME、FILETIME结构定义如下:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME, *PFILETIME, *LPFILETIME;
2.时间值的提取函数
(1)GetCurrentTime() 获取系统当前时间。
原型:static CTime PASCAL GetCurrentTime( );
(2)GetTime() 由CTime对象返回一个time_t变量。
原型:time_t GetTime( ) const;
(3)GetYear() 获取CTime对象代表的年。
原型:int GetYear( ) const;
以下(4)至(9)函数原型与GetYear()类似。
(4)GetMonth()获取CTime对象代表的月。
(5)GetDay() 获取CTime对象代表的日期。
(6)GetHour() 获取CTime对象代表的小时。
(7)GetMinute()获取CTime对象代表的分。
(8)GetSecond() 获取CTime对象代表的秒。
(9)GetDayOfWeek() 获取CTime对象代表的星期几,1代表周日、2代表周一、等等。
3.格式化时间
成员函数Format() 将CTime对象中的时间信息转化为一个格式化的字符串。其函数原型为:
CString Format( LPCTSTR pFormat ) const;
CString Format( UINT nFormatID ) const;
参数pFormat是格式字符串,类似于printf中的格式字符串,格式字符如下:
%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: 十进制表示的年;
参数nFormatID 是格式字符串资源的ID号。
4.重载运算符
operator = : 赋予新的时间。
operator + : 增加CTime和CTimeSpan对象。
operator – : 减小CTime和CTimeSpan对象。
operator += : CTime对象加一个CTimeSpan对象。
operator -= : CTime对象减一个CTimeSpan对象。
operator == : 比较两个绝对时间是否相等。
operator != : 比较两个绝对时间是否不相等。
operator > : 比较两个绝对时间,是否前一个大于后一个。
operator < : 比较两个绝对时间,是否前一个小于后一个。
operator >= : 比较两个绝对时间,是否前一个大于等于后一个。
operator <= : 比较两个绝对时间,是否前一个小于等于后一个。
例子代码
例1:获取当前时间
CTime m_time=CTime::GetCurrentTime();
CString s=m_time.Format("%A,%B,%d,%Y");
CString m_strTime="当前时间是:"+s;
MessageBox(m_strTime);
运行结果在信息框中显示“当前时间是:Sunday,February,4,2001”,程序第一行获取系统当前时间,并赋给m_time。第二行从m_time创建一个字符串对象,将该字符串赋给变量s,格式%A为周的英文全名形式,%B为月的英文全名形式,%d为十进制形式的日期(01-31),%Y为 十进制表示的年。
例2:由年、月、日得到对应的周日。
CTime m_time(2001,2,5,12,0,0);
int weekday=m_time.GetDayOfWeek();
switch(weekday)
{
case 1:
MessageBox("今天是周日");
break;
case 2:
MessageBox("今天是周一");
break;
case 3:
MessageBox("今天是周二");
break;
case 4:
MessageBox("今天是周三");
break;
case 5:
MessageBox("今天是周四");
break;
case 6:
MessageBox("今天是周五");
break;
case 7:
MessageBox("今天是周六");
break;
default:
break;
}
运行结果在信息框中显示“今天是周一”,m_time.GetDayOfWeek()获取m_time代表的周几(1代表周日,2代表周一等等)。
MFC编程中CTime各种格式转换
(一)获得当前日期和时间,并可以转化为 CString
CTime tm=CTime::GetCurrentTime();
CString str=tm.Format("%Y-%m-%d");
或者
SYSTEMTIME systemTime;
::GetLocalTime(&systemTime);
CTime cTimeNow(systemTime);
// 还有一个GetSystemTime();
在VC中,我们可以借助CTime时间类,获取系统当前日期,具体使用方法如下:
CTime t = CTime::GetCurrentTime(); //获取系统日期
int d=t.GetDay(); //获得几号
int y=t.GetYear(); //获取年份
int m=t.GetMonth(); //获取当前月份
int h=t.GetHour(); //获取当前为几时
int mm=t.GetMinute(); //获取分钟
int s=t.GetSecond(); //获取秒
int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六
如果想计算两段时间的差值,可以使用CTimeSpan类,具体使用方法如下:
CTime t1( 1999, 3, 19, 22, 15, 0 );
CTime t = CTime::GetCurrentTime();
CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔
int iDay=span.GetDays(); //获取这段时间间隔共有多少天
int iHour=span.GetTotalHours(); //获取总共有多少小时
int iMin=span.GetTotalMinutes();//获取总共有多少分钟
int iSec=span.GetTotalSeconds();//获取总共有多少秒
(二)CString转化为CTime
//转化为CTime
CString strTime="2008-7-2 21:59:11";
COleVariant vtime(strTime);
vtime.ChangeType(VT_DATE);
COleDateTime cOleTime=vtime;
SYSTEMTIME systime;
VariantTimeToSystemTime(cOleTime, &systime);
CTime cTimeFromDB(systime);
(三)CTime 与COleDateTime
CTime是无符号long型,范围0-4 2 9 4 9 6 7 2 9 5. 代表从1970年1月1日之后经过的秒数,所以到了2 0 3 7年它将达到4 2 9 4 9 6 7 2 9 5,从而不能再使用。
COleDateTime是double类型,占64位。代表从1 9 0 0年1 2月3 0号之后的天数(小时是天的小数部分),几千年之内不会溢出.
CTime COleDateTime相互转换:
//COleDataTime—>CTime
COleDateTime cOleTime(1977,4,16,2,2,2);
SYSTEMTIME systime;
VariantTimeToSystemTime(cOleTime, &systime);
CTime cTime(systime);
//CTime—>time_t
time_t tt=cTime.GetTime();
//time_t—>COleDateTime
COleDateTime cOleTime(tt);
CTime _Variant_t相互转换
SYSTEMTIME systime
CTime cTime(2007,5,7,0,0,0);
cTime.GetAsSystemTime(systime);//转成systime
double dtime;
SystemTimeToVariantTime(&systime,&dtime);
_variant_t var_time(dtime,VT_DATE);//var_time就是转换结果
补:
GetSystemTime:所返回的是UTC.
协调世界时(Coordinated Universal Time,简写作UTC,之前也被拼做Universal Time Coordina
ted,有时是Universal Coordinated Time)是由国际无线电咨询委员会定义和建议采用的,并由国际时间局(BIH)负责保持的以国际单位制(SI)秒为单位的时间标度。对与无线电规则相关 的大部分实际应用而言,协调世界时(UTC)与本初子午线(经度零度)上的平均太阳时等效。该时间过去以格林威治平均时(GMT)表示。
协调世界时使用24小时制的时钟表示,但也可以被转换为12小时制的时钟(AM和PM)。UTC用于飞行和航海,它有时也被称作祖鲁。UTC使用阳历
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
CString转换成CTime
代码如下:
CString strCString="2011-03-24 14:45:22";
COleVariant vtime(strCString);
vtime.ChangeType(VT_DATE);
COleDateTime oletime=vtime;
SYSTEMTIME systime;
VariantTimeToSystemTime(oletime, &systime);
CTime time(oletime);
time既所得时间。
Ctime转换成CString
代码如下:
CString strTime;
CTime time;
time=CTime::GetCurrentTime();
strTime= m_time.Format("%Y-%m-%d %H:%M:%S:");
strTime就是所得到的字符串
//////////////////////////////////////////////////////
3.使用GetTickCount//获取程序运行时间
long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
Sleep(500); long t2=GetTickCount();//程序段结束后取得系统运行时间(ms)
str.Format("time:%dms",t2-t1);//前后之差即 程序运行时间
AfxMessageBox(str);//获取系统运行时间
long t=GetTickCount();
CString str,str1;
str1.Format("系统已运行 %d时",t/3600000);
str=str1; t%=3600000;
str1.Format("%d分",t/60000);
str+=str1; t%=60000;
str1.Format("%d秒",t/1000);
str+=str1; AfxMessageBox(str);
////////////////////////////////////////////////////////////////////////
一、将字符串2011-08-1800:00:00转换为字符串2011-8-18,通过以下的函数
CString DataDeleteZero(CString DATA)
{
CStringstrmonth,strday,stryear;
intyear=0,month=0,day=0;
year=atoi(DATA.Mid(0,4));
month=atoi(DATA.Mid(5,2));
day=atoi(DATA.Mid(8,2));
if(month<10)month=atoi(DATA.Mid(6,2));
if(day<10)day=atoi(DATA.Mid(9,2));
stryear.Format("%d",year);
strmonth.Format("%d",month);
strday.Format("%d",day);
DATA=stryear+"-"+strmonth+"-"+strday;
returnDATA;
}
二、MFC获得日期控件时间的cstring格式
变量定义:
CString strDate;
COleDateTime ole_time;
CTime c_time;
1、CString转换为COleDateTime
strDate = "2009-4-25 12:30:29";
ole_time.ParseDateTime(strDate);
2、COleDateTime转换为CString
strDate = ole_time.Format("%Y-%m-%d %H:%M:%S");
3、COleDateTime转换为CTime
SYSTEMT
IME sys_time;
ole_time.GetAsSystemTime(sys_time);
c_time = CTime(sys_time);
4、CTime转换为COleDateTime
SYSTEMTIME sys_time;
c_time.GetAsSystemTime(sys_time);
ole_time = COleDateTime(sys_time);
5、CTime转换为CString
CTime Time;
Time.Format(“%Y-%m-%d”);
得到的是2011-08-18格式的字符串时间
Time.Format(“%y-%m-%d”);
得到的是11-08-18格式的字符串时间,年份和上面不一样了
Time.Format(“%Y-%#m-%#d”);
得到的是2011-8-18格式的字符串时间,可以把月份与日的“0”去掉
Time.Format("%Y-%m-%d %H:%M:%S");
得到的是2011-8-18 00:00:00格式的字符串时间