ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

VC++获得当前系统日期和时间问题汇总

2021-07-14 17:03:38  阅读:271  来源: 互联网

标签:CTime Format CString 汇总 C++ 2d 日期 COleDateTime time


ref: https://blog.csdn.net/taifei/article/details/54847825

Ⅰ.VC中得到当前系统的时间和日期:

得到时间的方法一般都是得到从1900年0点0分到现在的秒数,然后转为年月日时分秒的形式得到当前的时间(时分秒)。主要方法如下:

1)使用CRT函数

C++代码  收藏代码
  1. char szCurrentDateTime[32];     
  2. time_t nowtime;     
  3. struct tm* ptm;     
  4. time(&nowtime);     
  5. ptm = localtime(&nowtime);     
  6. sprintf(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",     
  7.     ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,     
  8.     ptm->tm_hour, ptm->tm_min, ptm->tm_sec);    

2)使用SYSTEMTIME

C++代码  收藏代码
  1. char szCurrentDateTime[32];     
  2. SYSTEMTIME systm;     
  3. GetLocalTime(&systm);     
  4. sprintf(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",     
  5.         systm.wYear, systm.wMonth, systm.wDay,     
  6.         systm.wHour, systm.wMinute, systm.wSecond);    

3)使用CTime

C++代码  收藏代码
  1. char szCurrentDateTime[32];     
  2. CTime nowtime;     
  3. nowtime = CTime::GetCurrentTime();     
  4.     
  5. sprintf(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",     
  6.     nowtime.GetYear(), nowtime.GetMonth(), nowtime.GetDay(),     
  7.     nowtime.GetHour(), nowtime.GetMinute(), nowtime.GetSecond());   

Ⅱ.用VC++获取系统时间几种方法:

A:

1 使用time_t time( time_t * timer )    精确到秒
  计算时间差使用double difftime( time_t timer1, time_t timer0 ) 2 使用clock_t clock() 得到的是CPU时间    精确到1/CLOCKS_PER_SEC秒 3 使用DWORD GetTickCount() 得到的是系统运行的时间 精确到毫秒 4 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒 5 要获取高精度时间,可以使用
    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值
    然后用两次计数器的差除以Frequency就得到时间。 6 还有David的文章中提到的方法:
    Multimedia Timer Functions
    The following functions are used with multimedia timers.
    timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime
    timeGetTime/timeKillEvent/TimeProc/timeSetEvent  精度很高 Q:GetTickCount()函数,说是毫秒记数,是真的吗,还是精确到55毫秒? A:
GetTickCount()和GetCurrentTime()都只精确到55ms(1个tick就是55ms)。如果要精确到毫秒,应该使用timeGetTime函数或QueryPerformanceCounter函数。具体例子可以参考QA001022 "VC++中使用高精度定时器"、QA001813 "如何在Windows实现准确的定时"和QA004842 "timeGetTime函数延时不准"。 Q:vc++怎样获取系统时间,返回值是什么类型的变量呢? GetSystemTime返回的是格林威志标准时间 
GetLocalTime,和上面用法一样,返回的是你所在地区的时间,中国返回的是北京时间 
 
VOID GetSystemTime( 
LPSYSTEMTIME lpSystemTime // address of system time structure 
); 
函数就可以获得了,其中LPSYSTEMTIME 是个结构体 
含:年,月,日,周几,小时,分,秒,毫秒。

Ⅲ.VC++获得当前系统时间的几种方案

//方案- 优点:仅使用C标准库;缺点:只能精确到秒级

  1. #include < time.h>   
  2. #include < stdio.h>   
  3. int main( void )   
  4. {   
  5. time_t t = time( 0 );   
  6. char tmp[64];   
  7. strftime( tmp, sizeof(tmp), " %Y/%m/%d %X %A 本年第%j天 %z" , localtime(&t) );   
  8. puts( tmp );   
  9. return 0;   
  10. }  

//方案二 优点:能精确到毫秒级;缺点:使用了windows API


  1. #include < windows.h>   
  2. #include < stdio.h>   
  3. int main( void )   
  4. {   
  5. SYSTEMTIME sys;   
  6. GetLocalTime( &sys );   
  7. printf( " M/d/d d:d:d.d 星期\n"   
  8. ,sys.wYear,sys.wMonth,sys.wDay   
  9. ,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds   
  10. ,sys.wDayOfWeek);   
  11. return 0;   
  12. }  

//方案三,优点:利用系统函数


  1. #include< stdlib.h>   
  2. #include< iostream>   
  3. using namespace std;   
  4. void main(){   
  5. system(" time" );   
  6. }  

可以改变电脑的时间设定

方案4:


  1. #include< iostream>   
  2. #include< ctime>   
  3. using namespace std;   
  4. int main()   
  5. {   
  6. time_t now_time;   
  7. now_time = time(NULL);   
  8. cout< < now_time;   
  9. return 0;   
  10. }  

另一:_strdate(tempstr);

另二: CTime


  1. CString CTestView::GetTime()   
  2. {   
  3. CTime CurrentTime=CTime::GetCurrentTime();   
  4. CString strTime;   
  5. strTime.Format(" %d:%d:%d" ,CurrentTime.GetHour(), CurrentTime.GetMinute()   
  6. ,CurrentTime.GetSecond());   
  7. return strTime;   
  8. }  

Ⅳ.VC++ 时间类型转换: CTime, COleDateTime, time_t, CString

CTime==>CString 

CTime time;
time.GetCurrentTime();
CString str;
str.Format("%s",time.Format("%y:%m:%d %H-%M-%S")

1
CString str;
CTime t = CTime::GetCurrentTime();
str.Format("%d-%d-%d",t.GetYear(),t.GetMonth(),t.GetDay());
2
CString strTime;
CTime tTime = CTime::GetCurrentTime();
strTime = tTime.Format("%Y-%m-%d %H:%M:%S");

CString ==>CTime 

strCString="2003-10-27 6:24:37"; //CString--->COleDateTime 
COleVariant vtime(strCString);
vtime.ChangeType(VT_DATE);
COleDateTime time4=vtime;

COleDateTime time1(1977,4,16,2,2,2); //COleDataTime--->CTime
SYSTEMTIME systime;
VariantTimeToSystemTime(time1, &systime);
CTime tm(systime);

time_t time2=tm.GetTime(); //CTime--->time_t 
COleDateTime time3(time2); //time_t--->COleDateTime 

时间差
COleDateTime strFirst,strEnd;
strFirst = COleDateTime(strFirst.GetYear(),strFirst.GetMonth(),strFirst.GetDay(),0,0,0);
strEnd = COleDateTime(tmCurrent.GetYear(),tmCurrent.GetMonth(),tmCurrent.GetDay(),23,59,59);
tspan= strEnd - strFirst;      //CTime类的使用    
  实例代码:    
  CTime   tNow;    
  tNow=CTime::GetCurrentTime();    
  CString   sNowDate=tNow.Format("%y.%m.%d");   //年.月.日    
  CString   sNowTime=tNow.Format("%I:%M:%S");   //时.分.秒    
  int   ntWeek   =   tNow.GetDayOfWeek();    
     
  CTime类的方法:    
  GetTime()    
  GetYear()    
  GetNonth()    
  GetHour()    
  GetMinute()    
  GetSecond()    
  GetDayOfWeek()    
     
     
  Format的变量含义:    
  %a       周的缩写    
  %A       周的全名    
  %b       月的缩写    
  %B       月的全名    
  %c       完整的日期和时间    
  %d       十进制形式的日期(01-31)    
  %H       24小时制的小时(00-24)    
  %I       12小时制的小时(01-12)    
  %j       十进制表示的一年的第几天(001-366)    
  %m       月的十进制表示(01-12)    
  %M       十进制表示的分钟(00-59)    
  %p       12小时制的上下午(AM/PM)标识    
  %S       十进制标识的秒    
  %U       一年中的第几个星期(00-51),星期日是一周的第一天    
  %W       一年中的第几个星期(00-51),星期一是一周的第一天    
  %w       十进制表示的星期几(0-6),0表示星期天    
  %x       当前时区的日期    
  %X       当前时区的时间    
  %y       用两位数(后两位)表示的年(00-99),如1960年表示成60    
  %Y       用四位数标示的年,如1960    
  %z/Z   小写/大写的时区名,如果时区不知,则为空串    
  %%       百分比的标志      补充: MFC与C++关于CTime类、COleDateTime类与CTimeSpan类的使用


关于CTime类、COleDateTime类与CTimeSpan类的详细介绍可以参考MSDN:
https://msdn.microsoft.com/zh-cn/library/78zb0ese
https://msdn.microsoft.com/zh-cn/library/38wh24td(v=vs.100).aspx
https://msdn.microsoft.com/zh-cn/library/ay6ws8h3
本文只是给出这些类的能提供的常用功能。

二、常用功能
1、CTime获取当天时间
CTime ti = CTime::GetCurrentTime();
2、当前时间增加或减少一天
昨天:CTime ti = CTime::GetCurrentTime()-CTimeSpan( 1, 0, 0, 0 );
明天:CTime ti = CTime::GetCurrentTime()+CTimeSpan( 1, 0, 0, 0 );
CTimeSpan的第一个参数为天数,通过调节该参数可以给出若干天前后的时间。举一反三,可以通过它的对象接收两个CTime对象的差值,给出时间跨度。
3、CTime与COleDateTime转换
3.1、CTime转COleDateTime
CTime ti = CTime::GetCurrentTime()
time_t tm = ti.GetTime();
COleDateTime toi(tm);
XValues[i] = COleDateTime(tm);

三、CTime类与COleDateTime类的区别:
1、CTime和COleDateTime功能相近。不过COleDateTime使用更广泛,该类允许用户获得一年中的某一天,还可以分析时间字符串。
2、COleDateTime支持DWORD变量。COleDateTime使用double类型,它表示从1900年12月30号之后的天数(小时是天的小数部分),几千年之内不会溢出。CTime只是简单地计算从1970年1月1日之后经过的秒数,所以到了2037年它将达到4294967295后溢出。
3、 把时间转换为字符串。
      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
4、 把字符串转换为时间。
         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文档中的strftime
使用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();
说明
一、COleDateTime
.Net有DateTime类用来处理日期时间,很方便,VC则可以用ATL库的COleDateTime类,用起来也还不错:
首先包含相关的头文件:
#include <ATLComTime.h>
初始化COleDateTime实例:
COleDateTime date_time;
date_time.SetDate(Year, Month, Day);
date_time.SetTime(Hour, Minute, Second);
COleDateTime重载了+,-,+=,-=等运算符,可以方便的让时间日期前进倒退,操作对象为COleDateTimeSpan,如:
date_time += COleDateTimeSpan(Day, Hour, Minute, Second); //天,时,分,秒
COleDateTime还可以将一个有效的时间字符串Parse过来,初始化实例本身:
date_time.ParseDateTime(CString("2008-04-18 09:00:00"));
反过来,COleDateTime可以Format成一个时间日期格式的字符串CString:
date_time.Format(L"%Y%m%d"); // 年,月,日, 注意m大写表示分钟Minute
二、CString
CString用法比较简单,可是有些用法长期不用会忘掉,为了下次要用的时候能快速通过经验找到答案,所以还是写下一些东西。
CString 有个Format成员,能转化成一个CString,参数跟C的printf用法差不多,如:
CString str;
str.Format("%s%d%02i", CString("Example"), 9, 1);// 第一个参数string,第二个Signed十进制数,第三个是宽度为2,不够则以0填充的Signed十进制数,
因此操作之后str的值为:
Expample901
CTime COleDateTime的常用操作和比较(转)
 
1) 获取当前时间。
datetime = COleDateTime::GetCurrentTime();
CTime和COleDateTime具有几乎同样的功能。
与CTime相比, COleDateTime的优点在于它支持DWORD变量。
COleDateTime使用的位数是双浮点的两倍,既然CTime只是简单地计算从1970年1月1日之后经过的秒数,所以到了2 0 3 7年它将达到4 2 9 4 9 6 7 2 9 5,从而不能再使用。
//CString--->COleDateTime
COleVariant vtime(strCString);COleDateTime time4=vtime;
//CTime--->time_t
COleDateTime time3(time2);
//time_t--->COleDateTime.
CString COleDateTime CTime互相转换 
strCString="2003-10-27 6:24:37"; //CString--->COleDateTime
COleVariant vtime(strCString);
vtime.ChangeType(VT_DATE);
COleDateTime time4=vtime;
COleDateTime time1(1977,4,16,2,2,2); //COleDataTime--->CTime
SYSTEMTIME systime;
VariantTimeToSystemTime(time1, &systime);
CTime tm(systime);
time_t time2=tm.GetTime(); //CTime--->time_t
COleDateTime time3(time2); //time_t--->COleDateTime
CString str = tDate.Format(_T("%Y-%m-%d"));

标签:CTime,Format,CString,汇总,C++,2d,日期,COleDateTime,time
来源: https://www.cnblogs.com/carl2380/p/15011756.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有