std :: chrono :: system_clock和duration <double>

时间:2016-02-29 07:23:46

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

我可以使用以下方式衡量时间:

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<double>

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

2 个答案:

答案 0 :(得分:3)

这是你想要的吗?

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();

输出:差异为1500毫秒

Live Demo

答案 1 :(得分:1)

好的,我选择了以下内容(因为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'的舍入行为(以秒为单位)是未指定的,如果我需要小数秒,我会单独提取它。