将steady_clock::time_point转换为time_t

15

我正在使用steady_clock来保存一些消息的时间戳。为了调试目的,拥有日历(或类似的东西)是有用的。

对于其他的时钟,有一个静态函数to_time_t,但在GCC(MinGW 4.8.0)中不存在这个函数。

现在我打印出如下内容:

Timestamp: 26735259098242

为了时间戳,我需要一个稳定时钟,因此不能使用 system_clock 或其他时钟。

编辑: 上一行中的输出是通过 time_since_epoch().count() 得到的。


一个 steady_clock::now().time_since_epoch() 的值为 0.12 毫秒,那么对应的期望 time_t 值是多少?定义转换方法即可得出答案。 - Cubbi
1
(to|from)_time_t 只对系统时钟有意义。例如,high_resolution_clock 可能无法支持整个 time_t 的范围。 - kennytm
3
你的电脑重启已经大约7小时42分钟了吗? - Howard Hinnant
我不确定,但可能是类似的东西。这样数字就可以表示自启动以来的微秒数。 - Elvis Dukaj
2
在我的系统上,它不是gcc/mingw,steady_clock的纪元是自启动以来的纳秒。在你的系统上可能是一样的。进行实验很容易。 - Howard Hinnant
1个回答

29
假设您需要在内部计算中保持稳定的行为,而不是用于显示,这里有一个函数可用于将其转换为 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()
                 + duration_cast<system_clock::duration>(t - steady_clock::now()));
}

如果您需要稳定的日志行为,您需要在启动时获取一个 ( system_clock::now(), steady_clock::now() ) 对,并在以后永久使用它。


3
@sstn:频率差异由Chrono操作符定义处理。如果你想要一个稳定的时钟,就必须只使用一个基准。手动或NTP更新会使时钟变得不稳定,甚至可能呈现单调变化。 - Ben Voigt
如果需要将不同系统之间的日志关联起来,那么steady_clock_to_time_t也是所需之物,因此日志在应用程序启动后包含时间调整。 - Igor Bukanov
3
在我的应用程序中,我使用steady_clock来基于持续时间设置各种过期时间。这些时间不能受到壁钟更改的影响。然而,在日志中,我希望使用壁钟来关联不同系统之间的事件时间。 - Igor Bukanov
11
在我的 MSVC(Windows 10,64 位)上这个代码无法工作,会出现编译错误。为了让它能够工作,我不得不使用 `return system_clock::to_time_t(system_clock::now()
  • duration_cast<system_clock::duration>(t - steady_clock::now()))这行代码。请注意多出来的duration_cast`。
- Bernard
1
@artlessnoise:如果您想在日志中获得稳定的行为,可以放弃夏令时的概念(例如使用UTC)。这将与我上一段建议相符。主要答案假设日志需要以人类可读的本地时间表示,并且需要从稳定的时钟进行转换,但本身不需要是单调的(在DST更改或使用网络参考重新同步system_clock期间不会是单调的)。 - Ben Voigt
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接