在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中,我得到了一个编译器错误:



因此,不可能再将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提供了正确的本地时间。

最佳答案

这是因为 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);

关于c++ - 使用VC141将high_resolution_clock::time_point转换为time_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52292391/

10-12 14:55