获取系统当前时间
在调试, 日志输出, 代码优化时, 我们常常需要获得系统的时间. 在一些性能要求高的代码优化时, 对时间的精确度还比较高. 在网上找不高质量的代码, 便自己研究了一下, 代码如下(能满足跨平台的要求, 单位精确到微秒):
- #ifdef _WIN32
- #include <windows.h>
- #else
- #include <time.h>
- #endif // _WIND32
- // 定义 64 位整形
- #if defined(_WIN32) && !defined(CYGWIN)
- typedef __int64 int64_t;
- #else
- typedef long long int64t;
- #endif // _WIN32
- // 获取系统的当前时间, 单位微秒(us)
- int64_t GetSysTimeMicros()
- {
- #ifdef _WIN32
- // 从 1601 年 1 月 1 日 0:0:0:000 到 1970 年 1 月 1 日 0:0:0:000 的时间(单位 100ns)
- #define EPOCHFILETIME (116444736000000000UL)
- FILETIME ft;
- LARGE_INTEGER li;
- int64_t tt = 0;
- GetSystemTimeAsFileTime(&ft);
- li.LowPart = ft.dwLowDateTime;
- li.HighPart = ft.dwHighDateTime;
- // 从 1970 年 1 月 1 日 0:0:0:000 到现在的微秒数(UTC 时间)
- tt = (li.QuadPart - EPOCHFILETIME) /10;
- return tt;
- #else
- timeval tv;
- gettimeofday(&tv, 0);
- return (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec;
- #endif // _WIN32
- return 0;
- }
代码说明
在类 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).
C++ 获取系统当前时间(精确到微秒)
来源: http://www.bubuko.com/infodetail-2596363.html