将steady_clock :: time_point转换为time_t

elv*_*kaj 9 c++ c++11 c++-chrono

我正在使用它steady_clock来保存某些消息的时间戳.对于调试目的,可以使用日历(或类似的东西).

对于其他时钟,这是静态功能to_time_t,但在GCC(MinGW 4.8.0)上,此功能不存在.

现在我打印的东西像:

Timestamp: 26735259098242
Run Code Online (Sandbox Code Playgroud)

对于时间戳我需要一个steady_clock所以我不能使用system_clock或其他人.

编辑 上一个打印是从time_since_epoch().count()给出的

Ben*_*igt 18

假设您需要内部计算的稳定行为,而不是显示,这里是一个可用于转换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()));
}
Run Code Online (Sandbox Code Playgroud)

如果您需要稳定的日志记录行为,那么您希望( system_clock::now(), steady_clock::now() )在启动时获得一对并在之后永久使用它.

  • 这在MSVC上不起作用(Windows 10,64位); 有一个编译错误.为了使它工作,我不得不做`return system_clock :: to_time_t(system_clock :: now()+ duration_cast <system_clock :: duration>(t - steady_clock :: now()))`.注意额外的`duration_cast`. (6认同)
  • @sstn:chrono运算符定义处理频率差异.如果你想要一个稳定的时钟,你必须只使用一个基础.结合手动或ntp更新使得时钟不稳定,甚至可能是单调的. (3认同)
  • @BenVoigt 在我的应用程序中,我使用`steady_clock` 根据持续时间设置各种到期时间。这些不得受到挂钟变化的影响。然而在日志中,我想要挂钟来关联不同系统之间的事件时间。 (3认同)