代码之家  ›  专栏  ›  技术社区  ›  Micka

使用VC141将高分辨率时钟::时间点转换为时间

  •  1
  • Micka  · 技术社区  · 7 年前

    #include <chrono>
    #include <ctime>
    #include <iostream>
    #include <iomanip>
    #include <sstream>
    
    std::string Time_Point_String(const std::chrono::high_resolution_clock::time_point & timePoint)
    {
        time_t timeNow = std::chrono::system_clock::to_time_t(timePoint);
    
        tm time = *localtime(&timeNow);
    
        std::stringstream timeString;
    timeString << std::setfill('0') << 1900 + time.tm_year << "-" << std::setw(2) << time.tm_mon + 1 << "-" << std::setw(2) << time.tm_mday << " " << std::setw(2) << time.tm_hour << ":" << std::setw(2) << time.tm_min << ":" << std::setw(2) << time.tm_sec;
    
        return timeString.str();
    }
    
    int main()
    {
        const std::chrono::high_resolution_clock::time_point & timePoint = std::chrono::high_resolution_clock::now();
    
        std::cout << Time_Point_String(timePoint);
        return 0;
    }
    

    但在Visual Studio 2017中,我遇到了一个编译器错误:

    错误C2664“\uu time64\u t std::chrono::system\u clock::to\u time(const std::chrono::system\u clock::time\u point&)noexcept”:无法将参数1从“const std::chrono::stable\u clock::time\u point”转换为“const std::chrono::system\u clock::time\u point&”

    所以再也不可能把 high_resolution_clock::time_point time_point 喜欢 system_clock::time_point time_t 直接?

    我如何处理这种情况? 有可能吗(有些帖子说它们只是完全不同的时钟,转换没有意义)?

    2 回复  |  直到 7 年前
        1
  •  4
  •   YSC    7 年前

    这是因为 std::chrono::high_resolution_clock std::chrono::system_clock std::chrono::steady_clock :

    标准::时钟::高分辨率时钟 标准::时钟::系统时钟 标准::时钟::稳定时钟

    这意味着 std::chrono::high_resolution_clock::time_point 可以是的类型别名 std::chrono::system_clock::time_point ,也可以是其他类型。从您的问题可以猜到,它对MSVC2013有效,使您的代码有效,但对MSVC2017无效,使您的代码无效。

    std::chrono::high_resolution_clock::time_point timePoint = /* something */;
    std::chrono::system_clock::to_time_t(timePoint);
    
        2
  •  1
  •   Alan Birtles    7 年前

    您只能在 time_point 它来自同一个时钟。 std::chrono::high_resolution_clock 是另一个时钟的别名。如果真是这样的话 std::chrono::system_clock

    标准::时钟::高分辨率时钟 是另一个你可以近似转换的时钟 取当前时间与输入时间之差 标准::时钟::高分辨率时钟 在系统时间上加上这个差异:

    #include <iostream>
    #include <chrono>
    
    int main()
    {
      auto input = std::chrono::high_resolution_clock::now();
    
      auto highResNow = std::chrono::high_resolution_clock::now();
      auto systemNow = std::chrono::system_clock::now();
      auto output = systemNow + (highResNow - input);
      std::cout << std::chrono::system_clock::to_time_t( output ) << "\n";
    }
    

    请注意,理想情况下,转换只是近似值 highResNow systemNow 需要同时计算,但两者之间会有一个很小的差距。输入时间和当前时间越远,转换也越不可靠。