使用VC141将high_resolution_clock :: time_point转换为time_t

问题描述 投票:1回答:2

在我刚刚使用的Visual Studio 2013中

#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'__ time64_t std :: chrono :: system_clock :: to_time_t(const std :: chrono :: system_clock :: time_point&)noexcept':无法将参数1从'const std :: chrono :: steady_clock :: time_point'转换为'const std :: chrono :: system_clock :: time_point&'

所以不可能将high_resolution_clock::time_point转换为像time_point这样的不同system_clock::time_point,并且没有可能直接将high_resolution_clock::time_point转换为time_t

我该如何处理这种情况?是否有可能(有些SO帖子说他们只是完全不同的时钟,转换没有意义)?据我所见,该函数完成了我在Visual Studio 2013应用程序中的预期,它为high_resolution time_point提供了正确的本地时间。

c++ std chrono
2个回答
3
投票

这是因为std::chrono::high_resolution_clockstd::chrono::system_clockstd::chrono::steady_clock的类型别名:

std::chrono::high_resolution_clock表示实现提供的具有最小滴答周期的时钟。它可能是std::chrono::system_clockstd::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);

1
投票

您只能在同一时钟之间转换time_points。 std::chrono::high_resolution_clock是另一个时钟的别名。如果恰好是std::chrono::system_clock那么你可以转换为time_t。

如果std::chrono::high_resolution_clock是另一个时钟,您可以通过获取std::chrono::system_clock中当前时间和输入时间之间的差异并将该差异添加到系统时间来将其近似转换为std::chrono::high_resolution_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";
}

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

© www.soinside.com 2019 - 2024. All rights reserved.