2010-03-22 99 views
10

有人可以帮助我在Windows XP上使用Visual Studio C++ 2008的gettimeofday()函数吗?这里是我在网上找到的代码:如何使用gettimeofday()或类似于Visual Studio C++ 2008的东西?

#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); 

去年当我用VC++ 6测试这个代码时,它工作正常。但现在,当我使用VC++ 2008时,出现异常处理错误。那么有没有关于如何使用gettimeofday或类似的东西的想法?

感谢您的回复和任何帮助将是非常赞赏:

+0

你能发表你得到的例外吗? – Jason 2010-03-22 17:33:22

+0

请解释您遇到的实际错误 - “异常处理错误”不是很具体。 – 2010-03-22 17:33:25

+0

感谢您的回复!我已经发布了一个关于这个错误的问题,它是:http://stackoverflow.com/questions/2490449/how-to-solve-unhandled-exception-error-when-using-visual-c-2008 再次感谢您的回复 – make 2010-03-22 17:59:11

回答

2

有几种不同的类型来表示时间。下面是一些代码,我最近使用过的:

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

然后我又建立从local件一个字符串,但你可以做你想要在这一点上有什么。

Kate

+0

谢谢很多为您的答复。是!我可以使用time()函数,但它不如gettimeofday()函数那样精确,这使我成为一个问题,因为我试图将我在Unix上获得的结果与我在Windows上获得的结果进行比较。再次感谢! – make 2010-03-22 19:04:10

18

在UNIX中,时区结构的使用已过时。我不知道你为什么使用它。请参阅http://linux.about.com/od/commands/l/blcmdl2_gettime.htm但是,如果您希望使用此结构来了解当地时间的GMT(UTC)差异,那么将是:tz_minuteswest是GMT(UTC)的真实时差,tz_dsttime是一个标志,指示是否现在是夏时制正在使用。

你有了一些变化示例工作在Visual C细++ 2008速成:

#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; 
} 
+0

这帮助了我很多,但我需要更精确的时间。我使用了'GetSystemTimePreciseAsFileTime'来代替'GetSystemTimeAsFileTime',并且它工作得很完美。干杯。 – 2016-06-24 18:31:11

3

以秒为简单的秒表

FWIW:这是一个类似的,凯特的,但我只是想提及它,如果有人正在寻找最简单的秒表在C + +(计秒)。我知道,这不是什么大不了的事。它只有1秒的分辨率,所以如果你想发送微秒,继续与其他例子。

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