C/C++教程

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

本文主要是介绍VC++获得当前系统日期和时间问题汇总,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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"));
这篇关于VC++获得当前系统日期和时间问题汇总的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!