how to use gettimeofday() or something equivalent with Visual Studio C++ 2008?

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

Could someone please help me to use gettimeofday() function with Visual Studio C++ 2008 on Windows XP? here is a code that I found somewhere on the net:

#include < time.h > #include <windows.h>   #if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)   #define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64 #else   #define DELTA_EPOCH_IN_MICROSECS  11644473600000000ULL #endif  struct timezone  {   int  tz_minuteswest; /* minutes W of Greenwich */   int  tz_dsttime;     /* type of dst correction */ };  int gettimeofday(struct timeval *tv, struct timezone *tz) {   FILETIME ft;   unsigned __int64 tmpres = 0;   static int tzflag;    if (NULL != tv)   {     GetSystemTimeAsFileTime(&ft);      tmpres |= ft.dwHighDateTime;     tmpres <<= 32;     tmpres |= ft.dwLowDateTime;      /*converting file time to unix epoch*/     tmpres -= DELTA_EPOCH_IN_MICROSECS;      tmpres /= 10;  /*convert into microseconds*/     tv->tv_sec = (long)(tmpres / 1000000UL);     tv->tv_usec = (long)(tmpres % 1000000UL);   }    if (NULL != tz)   {     if (!tzflag)     {       _tzset();       tzflag++;     }     tz->tz_minuteswest = _timezone / 60;     tz->tz_dsttime = _daylight;   }    return 0; }  ... // call gettimeofday()  gettimeofday(&tv, &tz);   tm = localtime(&tv.tv_sec);  

Last year when I tested this code with VC++6, it worked fine. But now as I use VC++ 2008, I am getting error of exception handling. So is there any idea on how to use gettimeofday or something equivalent?

Thanks for your reply and any help would be very appreciated:

回答1:

In UNIX the use of the timezone struct is obsolete. I don't know why you use it. See http://linux.about.com/od/commands/l/blcmdl2_gettime.htm But if you want to use this structure to know about GMT(UTC) diffrence from your local time it will be next: tz_minuteswest is the real diffrence in minutes from GMT(UTC) and a tz_dsttime is a flag indicates whether daylight is now in use.

Your example with some changes works fine in Visual C++ 2008 Express:

#include "stdafx.h" #include <time.h> #include <windows.h>   const __int64 DELTA_EPOCH_IN_MICROSECS= 11644473600000000;  /* IN UNIX the use of the timezone struct is obsolete;  I don't know why you use it. See http://linux.about.com/od/commands/l/blcmdl2_gettime.htm  But if you want to use this structure to know about GMT(UTC) diffrence from your local time  it will be next: tz_minuteswest is the real diffrence in minutes from GMT(UTC) and a tz_dsttime is a flag  indicates whether daylight is now in use */ struct timezone2  {   __int32  tz_minuteswest; /* minutes W of Greenwich */   bool  tz_dsttime;     /* type of dst correction */ };  struct timeval2 { __int32    tv_sec;         /* seconds */ __int32    tv_usec;        /* microseconds */ };  int gettimeofday(struct timeval2 *tv/*in*/, struct timezone2 *tz/*in*/) {   FILETIME ft;   __int64 tmpres = 0;   TIME_ZONE_INFORMATION tz_winapi;   int rez=0;     ZeroMemory(&ft,sizeof(ft));    ZeroMemory(&tz_winapi,sizeof(tz_winapi));      GetSystemTimeAsFileTime(&ft);      tmpres = ft.dwHighDateTime;     tmpres <<= 32;     tmpres |= ft.dwLowDateTime;      /*converting file time to unix epoch*/     tmpres /= 10;  /*convert into microseconds*/     tmpres -= DELTA_EPOCH_IN_MICROSECS;      tv->tv_sec = (__int32)(tmpres*0.000001);     tv->tv_usec =(tmpres%1000000);       //_tzset(),don't work properly, so we use GetTimeZoneInformation     rez=GetTimeZoneInformation(&tz_winapi);     tz->tz_dsttime=(rez==2)?true:false;     tz->tz_minuteswest = tz_winapi.Bias + ((rez==2)?tz_winapi.DaylightBias:0);    return 0; }   int _tmain(int argc, _TCHAR* argv[]) { struct timeval2 tv; struct timezone2 tz; struct tm *tm1;  time_t time1;  ZeroMemory(&tv,sizeof(tv)); ZeroMemory(&tz,sizeof(tz));  gettimeofday(&tv, &tz); // call gettimeofday() time1=tv.tv_sec; tm1 = localtime(&time1);      FILE *f;  f=fopen("rez.txt","w");   fprintf(f,"%04d.%02d.%02d %02d:%02d:%02d\n",1900+tm1->tm_year,1+tm1->tm_mon,tm1->tm_mday,tm1->tm_hour,tm1->tm_min,tm1->tm_sec);  fprintf(f,"Diffrence between GMT(UTC) and local time=%d %s\n",tz.tz_minuteswest,"minutes");  fprintf(f,"Is Daylight now=%s\n",tz.tz_dsttime?"Yes":"No");   fclose(f);  return 0; } 


回答2:

Simple stopwatch in seconds

FWIW: This is a similar one as that of Kate, but I just wanted to mention it, if someone is looking for the most simple stopwatch in C++ (counting seconds). Not a big deal, I know. It has only resolution of 1 sec, so if you want to cound microsecs, go on with the other examples.

double seconds=0; time_t timer1, timer2; time(&timer1);  /* get current time  */ ... time(&timer2);  /* get current time  later */ seconds = difftime(timer2,timer1); 


回答3:

There are a few different types to represent a time. Here's some code I used recently:

time_t now; tm* local; time(&now);  local=localtime(&now); 

I then went on to build a string from pieces of local, but you could do what you wanted at this point.

Kate



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!