2014-09-30 4 views
11

Как распечатать time_point, когда time_point получен из high_resolution_clock?C++ 11 как распечатать часы с высоким разрешением time_point

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

Вы можете решить истекшую продолжительность: 'duration_cast > (stop-start) .count()' –

ответ

13

Там нет действительно изящный способ сделать это. 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: он насчитывает наносекунды с момента загрузки вашего компьютера.

+0

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

3

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^