zoukankan      html  css  js  c++  java
  • C++获取系统当前时间(精确到微秒)

    获取系统当前时间

    在调试、日志输出、代码优化时,我们常常需要获得系统的时间。在一些性能要求高的代码优化时,对时间的精确度还比较高。在网上找不高质量的代码,便自己研究了一下,代码如下(能满足跨平台的要求,单位精确到微秒):

    #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# 数据为空,不能对NULL调用此方法或属性的解决办法
    Hadoop开启后jps显示只有jps
    Ubuntu中eclipse端口被占
    Ubuntu在终端执行命令时出现的错误
    sudo passwd root输入普通用户密码后显示用户不再sudoers文件中
    周总结(4.4)
    《构建之法》读后感(三)
    周总结(3.28)
    软件工程团队项目介绍
    解决phpstudy中nginx服务器运行项目报错404问题
  • 原文地址:https://www.cnblogs.com/chixinfushui/p/9024262.html
Copyright © 2011-2022 走看看