获取时间和计算时间差的几种方法总结

转载自:http://blog.csdn.net/coder_xia/article/details/6566708

一、标准C和C++都可用

1、获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 )。 精确到秒。

测试程序如下:

 1 #include <time.h>
 2 #include <stdio.h>
 3 int main()
 4 {
 5     time_t start ,end ;
 6     double cost;
 7     time(&start);
 8     sleep(1);
 9     time(&end);
10     cost=difftime(end,start);
11     printf("%f/n",cost);
12     return 0;
13 }

本程序在fedora9测试通过。

关于代码中的sleep函数,需要注意的是:

1)在windows下,为Sleep函数,且包含windows.h

2)关于sleep中的数,在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。

2、clock_t clock(),clock()

获取的是计算机启动后的时间间隔,得到的是CPU时间,精确到1/CLOCKS_PER_SEC秒。

测试程序如下:

 1 #include <time.h>
 2 #include <stdio.h>
 3 int main()
 4 {
 5     double start,end,cost;
 6     start=clock();
 7     sleep(1);
 8     end=clock();
 9     cost=end-start;
10     printf("%f/n",cost);
11     return 0;
12 }

二、C++中(此处针对windows环境,标准c中则linux和windows都可以)

1、GetTickCount()

调用函数需包含windows.h。得到的是系统运行的时间 精确到毫秒,测试程序如下:

 1 #include <iostream>
 2 #include <windows.h>
 3 using namespace std;
 4 int main()
 5 {
 6     double start = GetTickCount();
 7     Sleep(1000);
 8     double  end=GetTickCount();
 9     cout << "GetTickCount:" << end-start << endl;
10         return 0;
11 }

2、GetLocalTime()

获得的是结构体保存的year,month等信息。而C语言time函数获得是从1970年1月1日0时0分0秒到此时的秒数。需要gmtime函数转换为常用的日历(返回的是世界时间,要显示常用的时间,则为localtime函数)。

在c语言中,保存常用日历的结构体为struct tm,包含在time.h中,c++语言为SYSTEMTIME结构体,包含在winbase.h(编程包含windows.h即可)。当然,精度肯定为秒了。

测试程序如下:

1 #include <iostream>
2 #include <windows.h>
3 using namespace std;
4 int main()
5 {
6     SYSTEMTIME start; //windows.h中
7     GetLocalTime(&start);//time.h的tm结构体一样的效果
8     cout<< start.year << endl;
9 }

c语言的gmtime方法的示范代码如下:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    struct tm *tm_ptr;
    time_t the_time;
    (void) time(&the_time);
    tm_ptr = gmtime(&the_time);
    printf("Raw time is %ld/n", the_time);
    printf("gmtime gives:/n");
    printf("date: %02d/%02d/%02d/n",
        tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
    printf("time: %02d:%02d:%02d/n",
        tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);
    exit(0);
}

另外,c语言有类似于GetLocalTime方法的函数ctime()。

对localtime(),原型为:struct tm *localtime(const time_t *timep);将测试程序的gmtime改为localtime,则可以看到输出的时间为争取时间和日期了。为了更友好的得到时间和日期,像date那样输出,可以用asctime或ctime函数,原型:char  *ctime(const time_t  *timeval);测试代码如下:

 1 #include <time.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 int main()
 5 {
 6     time_t the_time;
 7     time(&the_time);
 8     printf("The date is : %s /n" , ctime(&the_time));
 9     exit(0);
10 }

3、要获取高精度时间,可以使用

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值

然后用两次计数器的差除以Frequency就得到时间。

测试程序如下:

 1 #include <iostream>
 2 #include <windows.h>
 3 using namespace std;
 4 int main()
 5 {
 6     LARGE_INTEGER m_nFreq;
 7     LARGE_INTEGER m_nBeginTime;
 8     LARGE_INTEGER nEndTime;
 9     QueryPerformanceFrequency(&m_nFreq); // 获取时钟周期
10     QueryPerformanceCounter(&m_nBeginTime); // 获取时钟计数
11     Sleep(100);
12     QueryPerformanceCounter(&nEndTime);
13     cout << (double)(nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart << endl;
14 }

需要注意的就是结果需要强制转换为double,不然会得到如下错误:<< is ambiguous。

4、timeGetTime()。

精度:毫秒,与GetTickCount()相当。使用需要包含windows.h,并加入Winmm.lib(虽然查到资料说需要包含mmsystem.h,不过经验证,可以不用包含)。测试代码如下:

#include <iostream>
#include <windows.h>//GetTickCount
//#include <mmsystem.h>
using namespace std;
int main()
{
    DWORD  start = timeGetTime();//
    Sleep(1000);
    DWORD  end= timeGetTime();//
    cout <<  timeGetTime() << endl;
    return 0;
}

5、MFC中,CTime::GetCurrentTime() 精确到秒,不列出测试代码。

关于定时器什么的,目前用到地方不多,就不总结了

参考网址:

1、http://blog.csdn.net/wallaceli1981/archive/2009/10/24/4723218.aspx

2、http://wenku.baidu.com/view/beb3c9eef8c75fbfc77db2b5.html

获取时间和计算时间差的几种方法总结

时间: 2024-10-11 15:50:56

获取时间和计算时间差的几种方法总结的相关文章

【转载】c/c++在windows下获取时间和计算时间差的几种方法总结

一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 ). 精确到秒. 测试程序如下: #include <time.h> #include <stdio.h> int main() { time_t start ,end ; double cost; time(&start); sleep(1); time(&en

c和c++在windows下获取时间和计算时间差的方法总结

c/c++在windows下获取时间和计算时间差的几种方法总结 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 ). 精确到秒. 测试程序如下: 1 #include <time.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 time_t start, end; 7 double c

JS获取网页中HTML元素的几种方法分析

getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getElementsByTagName ###adv### 后两个是得到集合,byid只是得到单个对象 getElementById 的用法 举个例子: <a id="link1" name="link1" href=http://homepage.yesky.com>

获取母版页的相关内容有两种方法 --全了

获取母版页的相关内容有两种方法 1 通过findcontrol找控件ID需要在此事件中~因为Page_load中时是先内容页加载然后才是母版页加载    protected void Page_LoadComplete(object sender, EventArgs e)    {        Label2.Text = "现在时间是" + (Master.FindControl("Label1") as Label).Text;        if (Requ

iOS 获取文件的目录路径的几种方法 [转]

iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory())手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该

获取作用域里的值的4种方法

获取作用域里的值的4种方法: 1.java代码: <%request.getAttribute()%> 2.${requestScope/username} 3.<s:property value="#session.username"> 4.不知道作用域时候: <s:property value="#attr.username"/>

时间格式转时间戳的几种方法

前端时间格式转时间戳的几种方法 <script type="text/javascript"> var date=new Date(); console.log(date);//Wed Feb 13 2019 11:40:45 GMT+0800 (中国标准时间) // 1:不推荐这种办法,毫秒级别的数值被转化为000 var timeStamp1=Date.parse(date); console.log(timeStamp1);//1550029245000 // 2:通

RadioButon 获取单选按钮组选中值的两种方法!

在单选按钮中我们一般需要获得当前用户选择的按钮值是什么,想要得到用户的选择有两种方法. 第一种:在改变单选按钮组的值时获取.在改变单选按钮的值时获取选中项的值时,首先需要获取单选按钮组,然后为其添加OnCheckedChangeListener,并在onCheckedChanged()方法中根据参数checkedId获取被选中的单选按钮,并通过其getText()方法获取该单选按钮对应的值: 第二种:单击其他按钮时获取.首先需要在该按钮的单击事件的监听器的onClick()方法中,通过for循环

计算幂函数的几种方法

引言 我们知道,自然对数的底 e 定义为以下极限值: 这个公式很适合于对幂函数的计算进行一些测试,得到的结果是 e 的近似值,不用担心当 n 很大时计算结果会溢出. 测试程序 下面就是 Tester.cs: 1 using System; 2 using System.Numerics; 3 using System.Diagnostics; 4 using Skyiv.Extensions; 5 6 namespace Skyiv.Test 7 { 8 sealed class Tester