CTime和CString的相互转换
- 格式:doc
- 大小:48.50 KB
- 文档页数:3
C++获取windows系统时间的七种⽅式 转载⾃:1.CTime类:获取系统当前时间,精确到秒[cpp]1. CString str;2. CTime tm;3. tm=CTime::GetCurrentTime();//获取系统⽇期4. str=tm.Format("现在时间是%Y年%m⽉%d⽇ %X");5. MessageBox(str,NULL,MB_OK);</span>a,从CTimet中提取年⽉⽇时分秒[cpp]1. CTime t = CTime::GetCurrentTime();2. int d=t.GetDay(); //获得⼏号3. int y=t.GetYear(); //获取年份4. int m=t.GetMonth(); //获取当前⽉份5. int h=t.GetHour(); //获取当前为⼏时6. int mm=t.GetMinute(); //获取分钟7. int s=t.GetSecond(); //获取秒8. int w=t.GetDayOfWeek(); //获取星期⼏,注意1为星期天,7为星期六</span>b,计算两段时间的差值,可以使⽤CTimeSpan类,具体使⽤⽅法如下:[cpp]1. CTime t1( 1999, 3, 19, 22, 15, 0 );2. CTime t = CTime::GetCurrentTime();3. CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔4. int iDay=span.GetDays(); //获取这段时间间隔共有多少天5. int iHour=span.GetTotalHours(); //获取总共有多少⼩时6. int iMin=span.GetTotalMinutes();//获取总共有多少分钟7. int iSec=span.GetTotalSeconds();//获取总共有多少秒c,获得当前⽇期和时间,并可以转化为CString[cpp]1. CTime tm=CTime::GetCurrentTime();2. CString str=tm.Format("%Y-%m-%d");//显⽰年⽉⽇</span>2. time_t,time():C标准库(精确到秒)[cpp]1. time_t time(time_t *timer);//得到从标准计时点(⼀般是1970年1⽉1⽇午夜)到当前时间的秒数2. double difftime(time_t timer1,time_t timer0);//计算时间差</span>返回的字符串可以依下列的格式⽽定:[cpp]1. %a 星期⼏的缩写。
CString和CTime的相互转换问题描述:1、将时间字符串2011-03-06 08:17:28 存入Access数据库时,若Access数据库中字段类型若为日期/时间类型,则存入后时间字符串为2011-3-6 8:17:28 ;若字段类型为文本类型,则存入后时间字符串为2011-03-06 08:17:28 ,但是这种类型将在执行数据库语句时有所阻扰。
2、截图问题现象:8点本来应该出现在时间这一行,但是它去填补了0的位置。
任务描述:1、此次任务是将字符串以日期/时间类型存入数据库,以便使用基于时间的数据库语句;同时利用完搜索之后,可以把时间从数据库中提出,并且能把他们中的日期和时间分别提取出来。
2、若字符串为2011-3-6 8:17:28 类形式,由于可以是3月,也可以是11月,所以难以提取,故须保证字符串形式在提取之后仍然为2011-03-0608:17:28 类形式。
解决过程:方法一:主要利用CString = CTime.Format("%Y-%m-%d %H:%M:%S") ,该语句可以自动将2011-3-6 8:17:28 类形式转换为2011-03-06 08:17:28 类形式。
步骤(1)将字符串为2011-3-6 8:17:28恢复为CTime类型;步骤(2)将CTime转换为2011-03-06 08:17:28;步骤(3)将日期2011-03-06和时间08:17:28分别提取出来。
代码如下:CString date,time; //date代表日期,time代表时间CTime ctime_tmp;CStringToCTime(PrintTestTime,ctime_tmp);PrintTestTime = ctime_tmp.Format("%Y-%m-%d %H:%M:%S");CutTimeString(PrintTestTime,date,time); //date和time为引用/*****从时间字符串resource中提出日期date和时间time**********/ bool TestPrint::CutTimeString(CString resource, CString &date, CString &time) {char *Change = NULL;char *s1=NULL;char *s2=NULL;Change = new char[20]; //当然,以上的直接写成char *psz = new char[10];也是一样s1 = new char[11];s2 = new char[9];memset( Change, 0, (sizeof(char))*(20) );memset( s1, 0, (sizeof(char))*(11) );memset( s2, 0, (sizeof(char))*(9) );Change[19]='\0';s1[10]='\0';s2[8]='\0';strcpy( Change, resource);for(int i=0;i<19;i++){if(i<10) //比较{s1[i]=Change[i];}else if(i>=11)s2[i-11]=Change[i];}date=s1;time=s2;delete []Change;delete []s1;delete []s2;return true;}/*****************把时间字符串CString转换为CTime类型**************/ int TestPrint::CStringToCTime(CString str_source, CTime &Target){CString str_temp = str_source;int nY ear, nMonth, nDate, nHour, nMin, nSec;sscanf(str_temp, "%d-%d-%d %d:%d:%d", &nY ear, &nMonth, &nDate,&nHour, &nMin, &nSec);CTime ctime_temp(nY ear, nMonth, nDate, nHour, nMin, nSec);Target=ctime_temp;return 0;}方法二:校正后的截图3、。
项目中经常用到各种不同的语言的朋友们应该会比较有这样的体会:一种开发语言用了比较长的时间,突然间转到另外一种语言的话,不管是数据类型或者语法结构,多多少少都会有那么一点不适应。
哪怕MFC中的类型与标准C++也是一样的。
下面是MFC/C++/C中字符类型CString, int, string, char*之间的转换的说明与举例,经常用的东西,相信对于用C/C++的朋友,还是比较有用的。
1、CString,int,string,char*之间的转换string转CStringCString.format("%s", string.c_str());char转CStringCString.format("%s", char*);char转stringstring s(char *);string转char *char *p = string.c_str();// CString转std::stringCStringstr = dlg.GetPathName(); setlocale(LC_ALL, "chs");char *p = new char[256];wcstombs( p, str, 256 );m_fileName = p;1,string ->CStringCString.format("%s", string.c_str());用c_str()确实比data()要好. 2,char -> stringstring s(char *);你的只能初始化,在不是初始化的地方最好还是用assign(). 3,CString -> string string s(CString.GetBuffer()); GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.《C++标准函数库》中说的有三个函数可以将字符串的内容转换为字符数组和C—string1.data(),返回没有“\0”的字符串数组2,c_str(),返回有“\0”的字符串数组3,copy()CString互转int将字符转换为整数,可以使用atoi、_atoi64或atol。
1.DWORD型的数据转换成CString型CString str;DWORD dwValue = 121212;str.Format("%d",dwValue)2. CString型转_bstr_tCString strip=”HHHHHE”;_bstr_t pt;Pt= (_bstr_t)stripm_string.SetReadOnly();CString str_data;int len = m_string.LineLength();m_string.GetLine(0,str_data.GetBuffer(len), len);str_data.ReleaseBuffer(len);如果想把编辑框的文本转化为int型,只需调用函数atoi,如下所示:int num = atoi(str_data);则num中保存的就是int型的数据。
3.int转charint senid;for(senid=1;senid<161;senid++)char id[20];sprintf(id, "%d ",senid);strcat(nprocedure_id,(char *)id);4.将CString->char[] char*CString str;Char pp[20];strcpy(pp,str.GetBuffer(0));5.将ltime 转CStringCString strTime;m_CurTime = CTime::GetCurrentTime();strTime = m_CurTime.Format("%Y-%m-%d %H:%M:%S"); 1》string转wstringwstring s2ws(const string& s){_bstr_t t = s.c_str();wchar_t* pwchar = (wchar_t*)t;wstring result = pwchar;return result;}2》wstring转stringstring ws2s(const wstring& ws){_bstr_t t = ws.c_str();char* pchar = (char*)t;string result = pchar;return result;}3》string转cstringa)CString.format("%s", string.c_str());b)CString StringToCString(string str){CString result;for (int i=0;i<(int)str.length();i++){result+=str[i];}return result;}4》cstring转stringa)void ConvertCString2string(CString& strSrc,std::string& strDes) {#ifndef UNICODEstrDes = strSrc;#elseUSES_CONVERSION;strDes = W2A(strSrc.LockBuffer());strSrc.UnlockBuffer();#endif}b)string s(CString.GetBuffer());ReleaseBuffer();GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. c)string CStringToString(CString cstr){string result(cstr.GetLength(),'e');for (int i=0;i<cstr.GetLength();i++){result[i]=(char)cstr[i];}return result;}5》string转char *a)char *p = string.c_str();举例:string aa("aaa");char *c=aa.c_str();string mngName;char t[200];memset(t,0,200);strcpy(t,mngName.c_str());b)一个一个字符的赋值char *p = new char[sring的长度+1];p[string的长度]='/0';但是要注意最后赋值'/0'!!!char * StringToChar(string &str){int len=str.length();char * p= new char[len+1];for (int i=0;i<len;i++){p[i]=str[i];}p[len]='/0';}6》char* 转stringstring s(char *);你的只能初始化,在不是初始化的地方最好还是用assign();string CharToString(char*arr,int count){string result(arr,4);return result;}string是ansi编码字符charTCHAR是unicode编码字符wchar_t7》string转TCHAR */*wBuf 申明为指针即可。
MFC提供了两个日期和时间类CTime和CTimeSpan,分别代表相对时间和绝对时间。
CTime是基于格林威治平均时间(GMT)的,本地的时间由环境变量TZ决定。
CTimeSpan代表了时间间隔。
CTime类由下列成员函数:CTime()创建一个CTime对象。
GetCurrentTime()由当前时间创建一个CTime对象。
GetTime()由CTime对象返回一个time_t变量。
GetYear()获取CTime对象代表的年。
GetMonth()获取CTime对象代表的月。
GetDay() 获取CTime对象代表的日期。
GetHour() 获取CTime对象代表的小时。
GetMinute()获取CTime对象代表的分。
GetSecond() 获取CTime对象代表的秒。
GetDayOfWeek() 获取CTime对象代表的周日,1代表周日,2代表周-等等。
Format() 将字符串转换成一个基于本地时区的格式字符串。
FormatGmt() 将字符串转换成一个基于UTC(世界时)的格式字符串。
operator = 赋予新的时间。
operator + 增加CTime和CTimeSpan对象。
operator –减小CTime和CTimeSpan对象。
operator += CTime对象加一个CTimeSpan对象。
operator -= CTime对象减一个CTimeSpan对象。
operator == 比较两个绝对时间是否相等。
operator != 比较两个绝对时间是否不相等。
operator < 比较两个绝对时间,是否前一个大于后一个。
operator > 比较两个绝对时间,是否前一个小于后一个。
operator >= 比较两个绝对时间,是否前一个大于等于后一个。
operator <= 比较两个绝对时间,是否前一个小于等于后一个。
把收获总结如下:首先看几个函数的原型的声明(在time.h中):clock_t clock( void ) clock_t是用来保存时间的数据类型,是long 型double difftime(time_t time1, time_t time0); 取时间间隔的函数time_t time(time_t * timer); 日历时间函数char * asctime(const struct tm * timeptr); 将tm 类的时间结构转化为固定时间格式char * ctime(const time_t *timer); 将日历时间转化为固定时间格式time_t mktime(struct tm * timeptr); 以年、月、日、时、分、秒等分量保存的时间结构struct tm * gmtime(const time_t *timer); 将日历时间转化为格林尼治时间struct tm * localtime(const time_t * timer); 将日历时间转化为当地时间tm 的定义:struct tm {int tm_sec; /* 秒–取值区间为[0,59] */int tm_min; /* 分- 取值区间为[0,59] */int tm_hour; /* 时- 取值区间为[0,23] */int tm_mday; /* 一个月中的日期- 取值区间为[1,31] */int tm_mon; /* 月份(从一月开始,0代表一月)- 取值区间为[0,11] */int tm_year; /* 年份,其值等于实际年份减去1900 */int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推*/int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推*/int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。
1.CTime--〉CStringCTime t;t=CTime::GetCurrentTime();CString sur;sur.Format("%s",t.Format("%Y-%m-%d")); MessageBox(sur);2.long --> CStringlong a ;CString b;b.format("%ld",a);3.double --->CStringdouble a;CString b;b.format("%f",a);4.CString--〉CTimeCString sur;sur="2006-08-09";COleDateTime time1;time1.ParseDateTime(sur);SYSTEMTIME systime; VariantTimeToSystemTime(time1, &systime); CTime tm(systime);m_time=tm;UpdateData(false);5.CString和int,float之间的转换。
5.1 int <->CString1) int ->CStringint n = 1;str.Format("%d",n);2) CString->intCString str = "1";int n = _ttoi(str);5.2 char* 与CString1)char*->CStringchar sz[128];CString str;str.Format("%s",sz);2) CString-> char*CString str;int nLength = str.GetLength();char* sz = new char[nLength];sz = str.GetBuffer(0);5.3 float<->CString1)float/double->CStringfloat f = 0.0;CString str;str.Format("%f",f);2) CString->float/doubleCString str = "0.0";float f = _tto(str);Format函数第一个参数是要转的那个数的类型我现在的程序是int a = 21;double b = 3.45;str.Format("%03d%02.4f" , a , b);现在得到的结果是"0213.4500"%02.4f对b的整数部分不起作用我想要得到一个形如aaabb.bbbb的字符串("02103.4500"),如果a不足3位,用0补齐,如果b的整数和小数不足2位和4位也要用0补齐CString::Format("%d",xx);其中xx不能为双精度,不然会转化错误,应该使用CString::Format("%d",(LONG)xx);例:DOUBLE d = 22.443;CString str;str.Format("%d", d);转化后的str = "1924145349",这是错误的!1、CString to char*经过类型强制转换,可以将CString类型转换成char*,例如: CString cStr = "Hello,world!"; char* zStr = (char*)(LPCTSTR)cStr;2、char* to CStringchar*类型可以直接给CString,完成自动转换,例如: char* zStr = "Hello,world!"; CString cStr = zStr;3、CString to LPCSTR将CString转换成LPCSTR,需要获得CString的长度,例如: CString cStr = _T("Hello,world!"); int nLen = cStr.GetLength();LPCSTR lpszBuf = cStr.GetBuffer(nLen);4、CString to LPSTR这个和第3个技巧是一样的,例如: CString cStr = _T("Hello,world!"); int nLen = str.GetLength();LPSTR lpszBuf = str.GetBuffer(nLen);5、Char[] to int将字符串类型转换成整数型,可以使用atoi函数,例如:char c[10];int n; n = atoi(c)6、Char[] to float和第5个技巧一样,使用atof()函数可以转换成float型,例如: char c[10]; float f; f = atof(c);7、Char* to int和第5个技巧完全一样,例如: char *str = "100"; int i;i = atoi(str);一、其它数据类型转换为字符串短整型(int)itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制itoa(i,temp,2); ///按二进制方式转换长整型(long) ltoa(l,temp,10);二、从其它包含字符串的变量中获取指向该字符串的指针CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str; BSTR类型的_variant_t变量 v1 = (_bstr_t)"程序员";buf = _com_util::ConvertBSTRToString((_bstr_t)v1);三、字符串转换为其它数据类型 strcpy(temp,"123");短整型(int)i = atoi(temp); 长整型(long) l = atol(temp); 浮点(double) d = atof(temp);四、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:整数(int)str.Format("%d",i); 浮点数(float)str.Format("%f",i);字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 str = username;CString转字符数组:int a;char ch[20];CString str;strcpy(ch,CW2A(str));Int转char[]字符数组Int m_insA_Vchar insA_V[10] = {0};itoa(m_insA_V,insA_V,10);Float转char[]字符数组函数名: gcvt把浮点数转换成字符串,同时返回一个指向字符串的存储位置的指针的函数用法: char *gcvt(double value, int ndigit, char *buf);参数value——被转换的值。
CString的Format方法使用技巧小结(大全)第一篇:CString的Format方法使用技巧小结(大全)CString的Format方法使用技巧小结在VC中经常用到Format()来输出一个特定类型的变量到窗口上,该函数使用起来比较方便,但是如果对其函数中的参数不很熟悉的话用起来也是比较麻烦的。
因此,归纳了一下,以供大家查询之用:1).格式说明格式说明总是以%字符开始,以不同类型数据的格式方式%号: %d 输出带符号十进制数 %o输出无符号八进制数 %x输出无符号十六进制数 %u输出无符号数 %c输出单个字符 %s输出一串字符 %f输出实数(6位小数)%e以指数形式输出实数%g选用f与e格式中输出宽度较小的格式,不输出0 %ld输入输出long型数据%lf输入输出double型数据m.n中,m为数据输出宽度,n为输出小数位数比如常见的int、float和double这些数字类型转换为CString字符串只需一行代码就可以实现。
1、int转换为CString:CString str;int number=15;//str=“15” str.Format(_T(“%d”),number);//str=“ 15”(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)str.Format(_T(“%4d”),number);//str=“0015”(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)str.Format(_T(“%.4d”),number);long转换为CString的方法与上面相似,只需要把%d改为%ld 就可以了。
2、double转换为CString:CString str;double num=1.46;//str=“1.46” str.Format(_T(“%lf”),num);//str=“1.5”(.1表示小数点后留1位,小数点后超过1位则四舍五入)str.Format(_T(“%.1lf”),num);//str=“1.4600” str.Format(_T(“%.4f”),num);//str=“ 1.4600”(前面有1个空格)str.Format(_T(“%7.4f”),num);float转换为CString的方法也同上面相似,将lf%改为f%就可以了。
CString和CTime的相互转换
问题描述:
1、将时间字符串2011-03-06 08:17:28 存入Access数据库时,若Access数据库
中字段类型若为日期/时间类型,则存入后时间字符串为2011-3-6 8:17:28 ;若
字段类型为文本类型,则存入后时间字符串为2011-03-06 08:17:28 ,但是这
种类型将在执行数据库语句时有所阻扰。
2、截图
问题现象:8点本来应该出现在时间这一行,但是它去填补了0的位置。
任务描述:
1、此次任务是将字符串以日期/时间类型存入数据库,以便使用基于时间
的数据库语句;同时利用完搜索之后,可以把时间从数据库中提出,
并且能把他们中的日期和时间分别提取出来。
2、若字符串为2011-3-6 8:17:28 类形式,由于可以是3月,也可以是11
月,所以难以提取,故须保证字符串形式在提取之后仍然为2011-03-06
08:17:28 类形式。
解决过程:
方法一:
主要利用CString = CTime.Format("%Y-%m-%d %H:%M:%S") ,该语句可以自动将2011-3-6 8:17:28 类形式转换为2011-03-06 08:17:28 类形式。
步骤(1)将字符串为2011-3-6 8:17:28恢复为CTime类型;
步骤(2)将CTime转换为2011-03-06 08:17:28;
步骤(3)将日期2011-03-06和时间08:17:28分别提取出来。
代码如下:
CString date,time; //date代表日期,time代表时间
CTime ctime_tmp;
CStringToCTime(PrintTestTime,ctime_tmp);
PrintTestTime = ctime_tmp.Format("%Y-%m-%d %H:%M:%S");
CutTimeString(PrintTestTime,date,time); //date和time为引用
/*****从时间字符串resource中提出日期date和时间time**********/ bool TestPrint::CutTimeString(CString resource, CString &date, CString &time) {
char *Change = NULL;
char *s1=NULL;
char *s2=NULL;
Change = new char[20]; //当然,以上的直接写成char *psz = new char[10];也是一样
s1 = new char[11];
s2 = new char[9];
memset( Change, 0, (sizeof(char))*(20) );
memset( s1, 0, (sizeof(char))*(11) );
memset( s2, 0, (sizeof(char))*(9) );
Change[19]='\0';
s1[10]='\0';
s2[8]='\0';
strcpy( Change, resource);
for(int i=0;i<19;i++)
{
if(i<10) //比较
{
s1[i]=Change[i];
}
else if(i>=11)
s2[i-11]=Change[i];
}
date=s1;
time=s2;
delete []Change;
delete []s1;
delete []s2;
return true;
}
/*****************把时间字符串CString转换为CTime类型**************/ int TestPrint::CStringToCTime(CString str_source, CTime &Target)
{
CString str_temp = str_source;
int nY ear, nMonth, nDate, nHour, nMin, nSec;
sscanf(str_temp, "%d-%d-%d %d:%d:%d", &nY ear, &nMonth, &nDate,
&nHour, &nMin, &nSec);
CTime ctime_temp(nY ear, nMonth, nDate, nHour, nMin, nSec);
Target=ctime_temp;
return 0;
}
方法二:
校正后的截图
3、。