Edamame
Edamame

Reputation: 25366

C++: convert chrono::high_resolution_clock to time_t

I have the following code which works fine:

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

However, if I replace system_clock with high_resolution_clock like below:

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;

I got the following error:

    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.

Any idea how to make high_resolution_clock works here? (I am benchmarking some functions, so would like to use high_resolution_clock rather than system_clock) Thanks!

Upvotes: 3

Views: 1748

Answers (2)

Howard Hinnant
Howard Hinnant

Reputation: 218700

In general, it is not possible to convert chrono::high_resolution_clock::time_point to time_t. It is not just because it lacks a to_time_t member function. It is because:

There is absolutely no relationship between the time time_t measures and the time high_resolution_clock::time_point measures.

Think of high_resolution_clock as a stopwatch. You can use it to measure the time it took for some event to happen. But you can't tell the time of day with it.

On my platform, high_resolution_clock measures the number of nanoseconds since the system booted up. If you don't know what time the system booted, there's no way to translate high_resolution_clock into a time of day.

time_t on the other hand typically measures time since 1970-01-01 00:00:00 UTC, and so does have a relationship to the time-of-day.

Upvotes: 9

0x5453
0x5453

Reputation: 13589

On your system, high_resolution_clock is aliased to steady_clock, which is not required by the standard to implement to_time_t. It's possible that the two are incompatible, e.g. if time_t is seconds since epoch, and high_resolution_clock::period is smaller than 1 second, then you couldn't represent a high_resolution_clock::time_point as a time_t without a loss of precision.

If you are using this for benchmarking, you can probably skip the conversion to time_t altogether. Just do something like:

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;

Upvotes: 2

Related Questions