转自 http://hi.baidu.com/tantea/blog/item/24e1b1b5d6bd2e7e8bd4b29e.html


时间函数 与 64位表示 (Windows/Linux)
2010-06-04 16:23

QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER   为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略.公式如下: 
                              nStopCounter-nStartCounter 
ElapsedTime=------------------------------------     -   overhead 
                                      frequency

double   time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.QuadPart


使用QueryPerformanceCounter()可以得到微秒级(1/1000000秒)的时间: 
LONGLONG   t1,t2; 
LONGLONG   persecond; 
QueryPerformanceFrequency((LARGE_INTEGER   *)&persecond);//询问系统一秒钟的频率 
QueryPerformanceCounter((LARGE_INTEGER   *)&t1); 
//下面是你要计算运行时间的程序代码 
... 
QueryPerformanceCounter((LARGE_INTEGER   *)&t2); 
double   time=(t2-t1)/persecond;

这两个函数需要mmsystem.h,并要连接winmm.lib

====

typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

#define MAXLONGLONG                      (0x7fffffffffffffff)


#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    };
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

===============

C 中获得当前系统时间 
引用: 
//方案— 优点:仅使用C标准库;缺点:只能精确到秒级 
#include <time.h> 
#include <stdio.h> 
int main( void ) 

time_t t = time( 0 ); 
char tmp[64]; 
strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) ); 
puts( tmp ); 
return 0; 

引用: 
//方案二 优点:能精确到毫秒级;缺点:使用了windows API 
#include <windows.h> 
#include <stdio.h> 
int main( void ) 

SYSTEMTIME sys; 
GetLocalTime( &sys ); 
printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek); 
return 0; 

引用: 
//方案三,优点:利用系统函数,还能修改系统时间 
#include<stdlib.h> 
#include<iostream> 
using namespace std; 
void main() 

system("time"); 

引用: 
//方案四,将当前时间折算为秒级,再通过相应的时间换算即可 
#include<iostream> 
#include<ctime> 
using namespace std; 
int main() 

time_t now_time; 
now_time = time(NULL); 
cout<<now_time; 
return 0; 

time_t time(time_t *timer); 
得到系统时间, 
struct tm *gmtime(const time_t *timer; 
转化成tm格式。 
struct tm *localtime(const time_t *timer); 
有时区校正的。 
char *asctime(const struct tm *timeptr); 
得到 Wed Jan 02 02:03:55 1980\n\0 标准GSM格式时间字符串。 
size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr); 
根据格式字符串生成字符串。 
示例: 
char today[32] =""; 
char second[32] =""; 
tm *temptm; 
time_t temptime; 
temptime= time(0); 
temptm = localtime(&temptime); 
sprintf(today,"%d-%02d-%02d",temptm->tm_year+1900,temptm->tm_mon+1,temptm->tm_mday); 
sprintf(second,"%02d:%02d:%02d",temptm->tm_hour,temptm->tm_min,temptm->tm_sec); 
cout << "Time:" << second << endl; 

struct tm *lt; 

#ifdef __LINUX_OS 
struct timezone tz; 
struct timeval now; 
//获得 
时间戳 
gettimeofday(&now, &tz); 
lt = localtime(&now.tv_sec); 
#else 
long now; 
time(&now); 
lt = localtime(&now); 
#endif 


以上是两种系统下的时间获取方法Linux和Windows下的 

// 将当前时间转换成yyy-mm-dd hh:mm:ss的格式 
static char buff[30] = {0}; 
sprintf(buff, "%4d-%02d-%02d %02d:%02d:%02d", 
lt->tm_year+1900, 
lt->tm_mon+1, 
lt->tm_mday, 
lt->tm_hour, 
lt->tm_min, 
lt->tm_sec);


Logo

更多推荐