С++ 11 как распечатать часы с высоким разрешением time_point

Как распечатать time_point, когда time_point получен из high_resolution_clock?

timestamp = std::chrono::high_resolution_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(timestamp);
std::cout << std::ctime(&now) << std::endl;

При компиляции я получаю следующее сообщение об ошибке:

error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>'
        time_t tt = std::chrono::system_clock::to_time_t(timestamp);

Ответ 1

Нет истинного изящного способа сделать это. high_resolution_clock, как известно, не связано с UTC или любым другим календарем. Единственное, что вы можете сделать, это вывести его текущую продолжительность с неопределенной эпохи вместе с единицами этой продолжительности:

#include <chrono>
#include <iostream>

int
main()
{
    using Clock = std::chrono::high_resolution_clock;
    constexpr auto num = Clock::period::num;
    constexpr auto den = Clock::period::den;
    std::cout << Clock::now().time_since_epoch().count()
              << " [" << num << '/' << den << "] units since epoch\n";
}

Какие для меня выходы:

516583779589531 [1/1000000000] units since epoch

что означает, что это 516583779589531 наносекунды (или 516,583.779589531 секунд) с эпохи этих часов на моей машине. На моей машине это переводится на: моя машина была загружена почти на 6 дней. Но этот перевод не переносится.

Ах! И из вашего сообщения об ошибке вы указываете, что используете libС++. Если вы также находитесь в OS X, то у нас есть то же определение high_resolution_clock: он подсчитывает наносекунды с момента загрузки вашего компьютера.

Ответ 2

По крайней мере, когда я читаю вещи, цель состоит в том, что std::high_resolution_clock можно определить как обертку вокруг чего-то вроде счетчика штампа времени процессора, который просто представляет собой регистр, который увеличивает каждый тактовый такт процессора.

Это не обязательно случай (и с текущими системами, постоянно изменяющими частоту процессора, вероятно, плохая идея), но также должны поддерживаться другие аналогичные часы.

Нижняя строка: не может быть известной взаимосвязи между абсолютным временем и часами с высоким разрешением, поэтому она действительно определяется только для создания продолжительности, а не абсолютного времени.