C++获取系统当前时间(精确到微秒)
2016-05-05 19:02
579 查看
获取系统当前时间
在调试、日志输出、代码优化时,我们常常需要获得系统的时间。在一些性能要求高的代码优化时,对时间的精确度还比较高。在网上找不高质量的代码,便自己研究了一下,代码如下(能满足跨平台的要求,单位精确到微秒):#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)。
除特殊注明,阳光日志下文章均为原创,转载转载请注明出处
本文地址:http://sunlogging.com/2016/05/05/c获取系统当前时间精确到微秒/
相关文章推荐
- 系统时间改为2000年 修改系统时间病毒
- 基于javascript实现动态显示当前系统时间
- Shell实现系统时间和BIOS时间同步校准脚本分享
- 关于ftp下显示的时间和系统时间不一致的解决方法
- java显示当前的系统时间
- C#利用win32 Api 修改本地系统时间、获取硬盘序列号
- C#实现修改系统时间的方法
- js显示当前系统时间的代码
- 利用线程实现动态显示系统时间
- 6种javascript显示当前系统时间代码
- Android调用系统时间格式显示时间信息
- TextView显示系统时间(时钟功能带秒针变化
- javascript获取系统当前时间的方法
- python脚本设置超时机制系统时间的方法
- python脚本设置系统时间的两种方法
- 第12章 时间和日历历程
- C#获取系统时间
- linux 系统时间
- 防止病毒更改系统时间