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方法的示范代码如下:

  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6. struct tm *tm_ptr;
  7. time_t the_time;
  8. (void) time(&the_time);
  9. tm_ptr = gmtime(&the_time);
  10. printf("Raw time is %ld/n", the_time);
  11. printf("gmtime gives:/n");
  12. printf("date: %02d/%02d/%02d/n",
  13. tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
  14. printf("time: %02d:%02d:%02d/n",
  15. tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);
  16. exit(0);
  17. }

另外,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,不过经验证,可以不用包含)。测试代码如下:

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

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

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

参考网址:

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

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

c/c++在windows下获取时间和计算时间差的几种方法总结 【转】的更多相关文章

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

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

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

    http://blog.csdn.net/caimagic/article/details/50696609 我用的是GetTickCount(), 获取到的是毫秒.

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

    c/c++在windows下获取时间和计算时间差的几种方法总结 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double diff ...

  4. Windows下Apache+MySQL+PHP快速配置的几种方法

    Apache MySQL PHP Windows WAMP 1.易思EasySiteServer服务器集成环境 v1.0  (推荐) 尔创互联为推广其ESPCMS而开发的一个小东东,很好用.零配置,完 ...

  5. Windows下获取高精度时间注意事项

    Windows下获取高精度时间注意事项 [转贴 AdamWu]   花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...

  6. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  7. Windows下获取本机IP地址方法介绍

    Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...

  8. C语言实现Windows下获取IP和MAC地址。

    C语言实现Windows下获取IP和MAC地址. #include <winsock2.h> #include <stdio.h> #include <stdlib.h& ...

  9. .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法

    .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法 1.最简单的方法是修改后缀名为.zip然后解压,解压后就可以看到一张图片,这个就是文档内容了. 2.更 ...

随机推荐

  1. BlockingQueue drainTo()

    BlockingQueue BlockingQueue的核心方法:放入数据: offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果Blockin ...

  2. LeetCode239. Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  3. git reset用法

    git 删除 错误 提交的 commit 方法:         根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:    git reset -- ...

  4. hdu5823

    官方题解:直接状压dp就行了,f[S]表示点集S的色数,枚举子集转移(子集是独立集).这样是3^n的. 这样就可以过了……(独立集就是点互相没有连边) 学到了一个穷举子集的简便写法 for (int ...

  5. [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)

    问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...

  6. electron调用C#应用程序实现串口通信

    最近转入零售行业开发了一系列产品,包含便利店收银软件.会员系统.供应链系统.为了追赶潮流,收银软件使用了electron平台开发,界面效果.开发效率确实不错:但是涉及到串口通讯时遇到了麻烦,elect ...

  7. CentOS 7 上搭建 ownCloud 私有云

    所需软件 & 环境 操作系统:CentOS 7.3.1711 最小安装 (已关闭 SELinux 和防火墙) 应用软件: Nginx  .MariaDB  .PHP  .ownCloud 10 ...

  8. Openstack 网络服务 Neutron计算节点部署 (十一)

    一) Neutron计算节点部署 1.安装软件包 # yum install -y openstack-neutron-linuxbridge ebtables ipset 2.配置文件neutron ...

  9. hdu 4135 Co-prime (素数打表+容斥原理)

    题目链接 题意:问从A到B中与N互素的个数. 题解: 利用容斥原理:先求出与n互为素数的个数. 可以先将 n 进行素因子分解,然后用区间 x 除以 素因子,就得到了与 n 的 约数是那个素因子的个数, ...

  10. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3   题目描述 给 ...