获取系统当前时间
在调试、日志输出、代码优化时,我们常常需要获得系统的时间。在一些性能要求高的代码优化时,对时间的精确度还比较高。在网上找不高质量的代码,便自己研究了一下,代码如下(能满足跨平台的要求,单位精确到微秒):
1 #ifdef _WIN32 2 #include <windows.h> 3 #else 4 #include <time.h> 5 #endif // _WIND32 6 7 8 // 定义64位整形 9 #if defined(_WIN32) && !defined(CYGWIN) 10 typedef __int64 int64_t; 11 #else 12 typedef long long int64t; 13 #endif // _WIN32 14 15 // 获取系统的当前时间,单位微秒(us) 16 int64_t GetSysTimeMicros() 17 { 18 #ifdef _WIN32 19 // 从1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的时间(单位100ns) 20 #define EPOCHFILETIME (116444736000000000UL) 21 FILETIME ft; 22 LARGE_INTEGER li; 23 int64_t tt = 0; 24 GetSystemTimeAsFileTime(&ft); 25 li.LowPart = ft.dwLowDateTime; 26 li.HighPart = ft.dwHighDateTime; 27 // 从1970年1月1日0:0:0:000到现在的微秒数(UTC时间) 28 tt = (li.QuadPart - EPOCHFILETIME) /10; 29 return tt; 30 #else 31 timeval tv; 32 gettimeofday(&tv, 0); 33 return (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec; 34 #endif // _WIN32 35 return 0; 36 }
代码说明
在类Unix平台(Linux、OS-X)使用gettimeofday方法,这个简单,没什么好说,自己看代码。在Windows平台使用GetSystemTimeAsFileTime方法,这个需解释一下。
GetSystemTimeAsFileTime的输出参数是LPFILETIME,其结构如下:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
这个结构可表示为一个64位的数值,两个成为分别代码低32位和高32位,代表1601年1月1日开始到现在的计数器,计数间隔为100纳秒。
而
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
是将结构体转换成64位整形LARGE_INTEGER::QuadPart。
#define EPOCHFILETIME (116444736000000000UL)表示从1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的时间(单位100ns)。