C ++:将chrono :: high_resolution_clock转换为time_t

时间:2018-12-12 21:17:00

标签: c++ time chrono

我有下面的代码可以正常工作:

 auto my_time = std::chrono::system_clock::now();
 std::cout << "My Time is " << std::chrono::system_clock::to_time_t(my_time) << std::endl;

但是,如果我用high_resolution_clock替换system_clock,如下所示:

auto my_time = std::chrono::high_resolution_clock::now();
std::cout << "My Time is " << std::chrono::high_resolution_clock::to_time_t(my_time) << std::endl;

我遇到以下错误:

    no member named 'to_time_t' in 'std::__1::chrono::steady_clock'
    std::cout << "My Time is " << std::chrono::high_resolution_clock::to_time_t(my_time) << std::endl;
                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
1 error generated.

有什么想法可以使high_resolution_clock在这里起作用吗? (我正在对某些功能进行基准测试,因此想使用high_resolution_clock而不是system_clock)谢谢!

2 个答案:

答案 0 :(得分:6)

通常,无法将chrono::high_resolution_clock::time_point转换为time_t。这不仅仅是因为它缺少to_time_t成员函数。这是因为:

  

时间time_t和时间high_resolution_clock::time_point的测量之间绝对没有关系。

high_resolution_clock用作秒表。您可以使用它来衡量某个事件发生所花费的时间。但是您不能用它告诉一天中的时间。

在我的平台上,high_resolution_clock衡量自系统启动以来nanoseconds的数量。如果您不知道系统什么时候启动,则无法将high_resolution_clock转换为一天中的某个时间。

另一方面,

time_t通常测量的是UTC 1970-01-01 00:00:00以来的时间,因此 与时间有关。< / p>

答案 1 :(得分:3)

在您的系统上,high_resolution_clock的别名为steady_clock,这不是标准实现to_time_t所必需的。两者可能不兼容,例如如果time_t是距纪元以来的秒数,并且high_resolution_clock::period小于1秒,那么在不损失精度的情况下,您不能将high_resolution_clock::time_point表示为time_t

如果将其用于基准测试,则可能完全跳过到time_t的转换。只需执行以下操作即可:

auto start = std::chrono::high_resolution_clock::now();
my_function();
auto end = std::chrono::high_resolution_clock::now();
std::cout << "my_function took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;