【问题标题】:How to convert std::chrono::high_resolution_clock::now() to Windows File Time (and reverse conversion)如何将 std::chrono::high_resolution_clock::now() 转换为 Windows 文件时间(和反向转换)
【发布时间】:2019-06-24 14:03:02
【问题描述】:

有没有办法轻松地将 std::chrono::high_resolution_clock::now() 时间转换为 Windows 文件时间 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx)(并返回)?我不知道如何处理这个......

非常感谢!

【问题讨论】:

    标签: winapi c++11 visual-studio-2013


    【解决方案1】:

    如果您有(或可能有)100 纳秒或更高精度的 time_point:

    FILETIME fileTime = {0};
    
    // Filetime has a resolution of 100nanoseconds
    typedef std::chrono::duration<int64_t, std::ratio_multiply<std::hecto, std::nano>> hundrednanoseconds;
    
    // 100nanoseconds since unix epoch + epoch offset difference of filetime
    long long timePointTmp =
        std::chrono::duration_cast<hundrednanoseconds>(tp.time_since_epoch()).count() 
        + 116444736000000000;
    
    fileTime.dwLowDateTime = (unsigned long)timePointTmp;
    fileTime.dwHighDateTime = timePointTmp >> 32;
    
    return fileTime;
    

    【讨论】:

      【解决方案2】:

      您可以将time_point 转换为time_t,然后使用以下函数将其转换为FILETIME。

      std::time_t t;
      t = to_time_t(std::chrono::high_resolution_clock::now());
      

      然后转换为 FILETIME (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724228%28v=vs.85%29.aspx)

      #include <windows.h>
      #include <time.h>
      
      void TimetToFileTime( time_t t, LPFILETIME pft )
      {
          LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000;
          pft->dwLowDateTime = (DWORD) ll;
          pft->dwHighDateTime = ll >>32;
      } 
      

      另外,请记住在 Windows 上,high_resolution_clock 被实现为不那么高分辨率的system_clock

      【讨论】:

      • 谢谢,我找到了一个基于你和stackoverflow.com/questions/21050994/…的解决方案,它也可以用于sy​​stem_clock,它比std::time_t更精确,因为std::time_t表示以秒为单位的时间.
      • VS 2015 将修复 high_resolution_clock :)
      • 请考虑此转换将丢失所有亚秒级分辨率(因此 high_resolution_clock 分辨率没有太大区别)
      【解决方案3】:

      这似乎是正确的解决方案:

      FILETIME fileTime = { 0 };
      long long timePointTmp = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count() * 10 + 116444736000000000;
      fileTime.dwLowDateTime = (unsigned long)timePointTmp;
      fileTime.dwHighDateTime = timePointTmp >> 32;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        相关资源
        最近更新 更多