ref: https://blog.csdn.net/taifei/article/details/54847825
Ⅰ.VC中得到当前系统的时间和日期:
得到时间的方法一般都是得到从1900年0点0分到现在的秒数,然后转为年月日时分秒的形式得到当前的时间(时分秒)。主要方法如下:
1)使用CRT函数
- char szCurrentDateTime[32];
- time_t nowtime;
- struct tm* ptm;
- time(&nowtime);
- ptm = localtime(&nowtime);
- sprintf(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",
- ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,
- ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
2)使用SYSTEMTIME
- char szCurrentDateTime[32];
- SYSTEMTIME systm;
- GetLocalTime(&systm);
- sprintf(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",
- systm.wYear, systm.wMonth, systm.wDay,
- systm.wHour, systm.wMinute, systm.wSecond);
3)使用CTime
- char szCurrentDateTime[32];
- CTime nowtime;
- nowtime = CTime::GetCurrentTime();
- sprintf(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",
- nowtime.GetYear(), nowtime.GetMonth(), nowtime.GetDay(),
- nowtime.GetHour(), nowtime.GetMinute(), nowtime.GetSecond());
Ⅱ.用VC++获取系统时间几种方法:
A:
1 使用time_t time( time_t * timer ) 精确到秒
计算时间差使用double difftime( time_t timer1, time_t timer0 )
计算时间差使用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就得到时间。
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 精度很高
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函数延时不准"。
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 是个结构体
含:年,月,日,周几,小时,分,秒,毫秒。
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;
GetLocalTime,和上面用法一样,返回的是你所在地区的时间,中国返回的是北京时间
VOID GetSystemTime(
LPSYSTEMTIME lpSystemTime // address of system time structure
);
函数就可以获得了,其中LPSYSTEMTIME 是个结构体
含:年,月,日,周几,小时,分,秒,毫秒。
Ⅲ.VC++获得当前系统时间的几种方案
//方案- 优点:仅使用C标准库;缺点:只能精确到秒级- #include < time.h>
- #include < stdio.h>
- int main( void )
- {
- time_t t = time( 0 );
- char tmp[64];
- strftime( tmp, sizeof(tmp), " %Y/%m/%d %X %A 本年第%j天 %z" , localtime(&t) );
- puts( tmp );
- return 0;
- }
//方案二 优点:能精确到毫秒级;缺点:使用了windows API
- #include < windows.h>
- #include < stdio.h>
- int main( void )
- {
- SYSTEMTIME sys;
- GetLocalTime( &sys );
- printf( " M/d/d d:d:d.d 星期 "
- ,sys.wYear,sys.wMonth,sys.wDay
- ,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds
- ,sys.wDayOfWeek);
- return 0;
- }
//方案三,优点:利用系统函数
- #include< stdlib.h>
- #include< iostream>
- using namespace std;
- void main(){
- system(" time" );
- }
可以改变电脑的时间设定
方案4:
- #include< iostream>
- #include< ctime>
- using namespace std;
- int main()
- {
- time_t now_time;
- now_time = time(NULL);
- cout< < now_time;
- return 0;
- }
另一:_strdate(tempstr);
另二: CTime
- CString CTestView::GetTime()
- {
- CTime CurrentTime=CTime::GetCurrentTime();
- CString strTime;
- strTime.Format(" %d:%d:%d" ,CurrentTime.GetHour(), CurrentTime.GetMinute()
- ,CurrentTime.GetSecond());
- return strTime;
- }
Ⅳ.VC++ 时间类型转换: CTime, COleDateTime, time_t, CString
CTime==>CStringCTime 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 小写/大写的时区名,如果时区不知,则为空串
%% 百分比的标志
实例代码:
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类与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"));
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"));