Преобразование Stead_clock::time_point в time_t

Я использую steady_clock для сохранения отметки времени некоторых сообщений. Для целей отладки полезно иметь календарь (или что-то подобное).

Для других часов есть статическая функция to_time_t, но на GCC (MinGW 4.8.0) этой функции нет.

Теперь я печатаю что-то вроде:

Timestamp: 26735259098242

Для метки времени мне нужны устойчивые часы, поэтому я не могу использовать system_clock или другие.

Изменить Предыдущий отпечаток получен из time_since_epoch().count()


person Elvis Dukaj    schedule 21.08.2013    source источник
comment
Каким будет желаемое time_t значение steady_clock::now().time_since_epoch() из 0.12 milliseconds? Определите конверсию, и вы получите ответ.   -  person Cubbi    schedule 21.08.2013
comment
(to|from)_time_t имеет значение только для системных часов. Например, high_resolution_clock может не поддерживать диапазон всего time_t.   -  person kennytm    schedule 21.08.2013
comment
Прошло ли около 7 часов 42 минуты с тех пор, как вы перезагрузили компьютер?   -  person Howard Hinnant    schedule 21.08.2013
comment
Я не знаю, но может быть что-то подобное. Таким образом, это число может быть микросекундами с момента загрузки.   -  person Elvis Dukaj    schedule 22.08.2013
comment
В моей системе, которая не является gcc/mingw, эпоха steady_clock составляет наносекунды с момента загрузки. Это может быть то же самое в вашей системе. Эксперимент, чтобы выяснить, было бы легко для вас.   -  person Howard Hinnant    schedule 22.08.2013


Ответы (1)


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

using std::chrono::steady_clock;
using std::chrono::system_clock;

time_t steady_clock_to_time_t( steady_clock::time_point t )
{
    return system_clock::to_time_t(system_clock::now()
                                          + (t - steady_clock::now()));
}

Если вам нужно стабильное поведение для ведения журнала, вы хотите получить одну пару ( system_clock::now(), steady_clock::now() ) при запуске и использовать ее навсегда.

person Ben Voigt    schedule 04.09.2013
comment
Частота system_clock может на самом деле отличаться от частоты Steady_Clock из-за выравнивания часов с помощью ntp и т. д. Следовательно, использование этого навсегда может быть не очень хорошей идеей. Или в противном случае кто-то может просто изменить часы вручную. - person sstn; 30.05.2014
comment
@sstn: различия в частоте учитываются определениями хронографа. И вам нужно использовать только одну основу, если вы хотите стабильные часы. Включение ручных или ntp-обновлений делает часы неустойчивыми, потенциально даже монотонными. - person Ben Voigt; 30.05.2014
comment
Если вам нужно связать журналы между различными системами, то устойчивый_час_к_времени_t также является тем, что нужно, чтобы журнал включал корректировку времени после запуска приложения. - person Igor Bukanov; 18.02.2017
comment
@Igor: Если ваша цель состоит в том, чтобы включить корректировку времени, почему вы вообще используете steady_clock? - person Ben Voigt; 18.02.2017
comment
@BenVoigt В моем приложении я используюsteady_clock для установки различных сроков действия в зависимости от продолжительности. На них не должны влиять изменения настенных часов. Тем не менее, в журнале я хочу, чтобы настенные часы связывали время события между различными системами. - person Igor Bukanov; 19.02.2017
comment
У меня это не работает в MSVC (Windows 10, 64-разрядная версия); есть ошибка компиляции. Чтобы это заработало, мне пришлось сделать return system_clock::to_time_t(system_clock::now() + duration_cast<system_clock::duration>(t - steady_clock::now())). Обратите внимание на дополнительные duration_cast. - person Bernard; 21.03.2017
comment
Спасибо за публикацию этого :) - person Short; 26.05.2019
comment
Мне также пришлось применить исправление @Bernard, используя последнюю сборку от clang. - person Short; 05.07.2019