zoukankan      html  css  js  c++  java
  • 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 星期 "   
    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"));
  • 相关阅读:
    HDU-1561
    POJ 1088
    UESTC-878
    CodeForces
    HDU 5753
    HDU 1568
    二分图入门题
    二分图匹配入门题
    树形dp入门
    UVA
  • 原文地址:https://www.cnblogs.com/carl2380/p/15011756.html
Copyright © 2011-2022 走看看