计算时间差

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

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

测试程序如下:

[c-sharp] view plain copy

  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秒。

测试程序如下:

[c-sharp] view plain copy

  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。得到的是系统运行的时间 精确到毫秒,测试程序如下:

[c-sharp] view plain copy

  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即可)。当然,精度肯定为秒了。

测试程序如下:

[c-sharp] view plain copy

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

[c-sharp] view plain copy

  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);测试代码如下:

[c-sharp] view plain copy

  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就得到时间。

测试程序如下:

[c-sharp] view plain copy

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

[c-sharp] view plain copy

  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() 精确到秒,不列出测试代码。

时间: 2024-08-05 19:35:38

计算时间差的相关文章

asp.net中C#中计算时间差代码

我用的最简单的办法是 代码如下 复制代码 DateTime dtone = Convert.ToDateTime("2007-1-1 05:32:22");DateTime dtwo = Convert.ToDateTime("2007-1-1 04:20:15");TimeSpan span = dtone.Subtract(dtwo);Response.Write(span.Days + "天" + span.Hours + "小时

【转载】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

登录超时自动退出,计算时间差-b

// 此方法适用于所有被创建过的controller,且当前controller生命周期存在,如有错误的地方望大神斧正 //  说一下我们的需求和实现原理,需求:在点击home键退出但没有滑飞它,5分钟之后需要重新登录(其实和平安一账通的登录很像) :实现原理:添加观察者,不用我们手动发送通知,系统会自动发送通知,计算时间差,然后就可以啦?? //  贴代码图片 屏幕快照 2016-09-22 下午2.54.31.png //  我是控制的300s,就是5分钟,超过就弹个框,点击后退出 屏幕快照

mysql 计算时间差

ROUND(time_to_sec(timediff(m.StartTime, now()))/60) 解析: 比较m.StartTime字段的时间与now()现在的时间差. timediff : 计算时间差 time_to_sec:转化为秒 ROUND :取整

linux获取时间函数及计算时间差

参考:   http://www.cnblogs.com/krythur/archive/2013/02/25/2932647.html 第一章  获取时间函数 1. char * asctime(const struct tm * timeptr); 函数说明 asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,字符串格式为:"Wed Jun 30 21:49:08 1993\n&quo

linux内核计算时间差以及jiffies溢出

jiffies是每个时钟中断,都会加1,这就导致一个问题,无论jiffies(一般来说是unsigned long类型)多少个字节,总有溢出的时候. 更极端的时候,当期jiffies是0xffffffff,下一个时刻就是0x0 这样,当你计算延时/时差 的时候0x0 - 0xffffffff结果是 0xffffffff,实际上只是过了一个时钟周期,这种差别是巨大的. 那么如何防止这种情况发生呢? 很简单 假设t1是之前记录的jiffies,t2是当年的jiffies,你想要计算两者差值: (lo

sql server 计算时间差的一部分函数【转】

在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及GetDate()函数了.DATEDIFF ( datepart , startdate , enddate )释义:计算时间差datepare值:year | quarter | month | week | day | hour | minute | second | millisecondstartdate:开始日期enddate :结束日期GetDate(

php计算时间差/两个时间日期相隔的天数,时,分,秒.

<?php function timediff( $begin_time, $end_time ) { if ( $begin_time < $end_time ) { $starttime = $begin_time; $endtime = $end_time; } else { $starttime = $end_time; $endtime = $begin_time; } $timediff = $endtime - $starttime; $days = intval( $timed

java计算时间差

java实现计算时间差 正式版:       /** * 计算时间差,求出两者相隔的时间 * * @param nowDate *            当前时间 * @param calculateDate *            计算的时间 * @return */ public static long calculateTime(Date nowDate, Date calculateDate) { long ret = 0; try { long t = nowDate.getTime