2016-02-29 47 views
2

我可以用测量时间:的std ::时辰:: SYSTEM_CLOCK和持续时间<double>

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

+0

将持续时间转换为整数版本(例如std :: chrono :: microseconds)? – MikeMB

+0

@MikeMB您可以发表一个如何做的例子吗?我是否必须使用'duration :: period'将浮点值转换为持续时间? –

+0

何塞已经做到了。 – MikeMB

回答

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

我用“楼(dTimeS)”只是因为我在执行我不想秒的小数部分被围捕到秒。

下也应在新的编译器(根据何的答案)工作:

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'是未指定的,如果我需要小数秒我分别提取它。

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

+2

请注意'微秒'不能保证是'system_clock'的正确类型。你应该投到'system_clock :: duration' – user2079303

+0

我的编译器不接受'std :: chrono :: duration_cast (std :: chrono :: duration (1.5))' 。错误:'':无法从'_CR'转换为'std :: chrono :: system_clock :: duration'。 我正在使用VS2012 –

+0

这是因为VS 2012中存在一个错误。 –