2016-02-29 50 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中存在一個錯誤。 –