【问题标题】:std::chrono::system_clock and duration<double>std::chrono::system_clock 和 duration<double>
【发布时间】:2016-02-29 07:23:45
【问题描述】:

我可以使用以下方法测量时间:

t1 = system_clock::now();
...
t2 = system_clock::now();

duration<double> d = t2 - t1;

编译得很好,但是我该如何做相反的事情呢?我想使用持续时间移动时间点?

示例(不编译):

system_clock::time_point tp1 = system_clock::now();
system_clock::time_point tp2 = tp1 + duration<double>(1.0);

system_clock::time_point '+' 运算符似乎不接受duration&lt;double&gt;

如何将时间点移动以秒为单位的时间(浮点值)指定的持续时间?我需要使用system_clock,因为它可以转换为time_t

【问题讨论】:

  • 将持续时间转换为整数版本(例如 std::chrono::microseconds)?
  • @MikeMB 你能发布一个如何做到这一点的例子吗?我是否必须使用 'duration::period' 将浮点值转换为持续时间?

标签: c++ c++11 stl chrono


【解决方案1】:

这是你想要的吗?

system_clock::time_point tp1 = system_clock::now(); 
system_clock::time_point tp2 = tp1 + duration_cast<system_clock::duration>(duration<double>(1.5));
cout << duration_cast<milliseconds>(tp2 - tp1).count();

输出:相差1500ms

Live Demo

【讨论】:

  • 请注意,microseconds 不能保证是 system_clock 的正确类型。你应该投给system_clock::duration
  • 我的编译器不接受'std::chrono::duration_cast<:chrono::system_clock::duration>(std::chrono::duration(1.5))'。错误:“”:无法从“_CR”转换为“std::chrono::system_clock::duration”。我正在使用 VS2012
  • 这是因为 VS 2012 有一个 bug。
  • 对于这个错误有什么建议的解决方法吗?不幸的是,至少现在,我被 VS2012 困在过去。
【解决方案2】:

好的,我选择了以下内容(因为 VS2012 可能在 'duration_cast' 中存在错误)。将指定的持续时间(以秒为单位)(使用浮点)添加到 system_clock 时间点:

const double SECS_TO_SYSTEM_TICKS = (double)system_clock::period::den / (double)system_clock::period::num;
system_clock::time_point tp1 = system_clock::now()
double dTimeS = 1.0;

...

system_clock::duration d((system_clock::rep)(floor(dTimeS) * SECS_TO_SYSTEM_TICKS));
time_t t = system_clock::to_time_t(t1 + d);

我使用“floor(dTimeS)”只是因为在我的实现中我不希望小数秒被四舍五入到秒。

以下内容也应该适用于较新的编译器(根据 José 的回答):

system_clock::duration d = duration_cast<system_clock::duration>(duration<double>(floor(dTimeS)));
time_t t = system_clock::to_time_t(t1 + d);

这也对我有用:

auto secs = seconds((seconds::rep)floor(dTimeS));
auto system_ticks = duration_cast<system_clock::duration>(secs);
time_t t = system_clock::to_time_t(t1 + system_ticks);

注意:“to_time_t”的舍入行为(以秒计)未指定,如果我需要小数秒,我会单独提取它。

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 2013-06-28
    • 1970-01-01
    • 2017-09-02
    • 2013-12-05
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多