C ++ 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);

person John    schedule 30.09.2014    source источник
comment
Вы можете разрешить истекшее время: duration_cast<duration<double>>(stop - start).count()   -  person    schedule 30.09.2014


Ответы (2)


Нет по-настоящему изящного способа сделать это. 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 дней. Но этот перевод нельзя переносить.

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

person Howard Hinnant    schedule 30.09.2014
comment
Спасибо за объяснение - хотя сообщение об ошибке - libc ++, код должен быть независимым от платформы (по крайней мере, для OSX, Windows, Linux), поэтому я надеялся на легкую победу. Кажется странным, что нет связи между high_resolution_clock и системным временем, да ладно. На данный момент я реализовал с помощью system_clock. - person John; 01.10.2014

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

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

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

person Jerry Coffin    schedule 30.09.2014