2017-07-27 81 views
1

大家好我已經創建了一個C++應用程序,其中包括使用std :: chrono來計算時間差。
在某些時候,我上傳一個文件到服務器,作爲響應,我從receive.php獲得一個紀元時間戳,告知關於文件完全上傳到服務器的時間戳。我想計算一下這個紀元時間戳和我選擇的起點之間的時差,因爲我不應該改變這個rec​​eive.php工作方式。 到目前爲止,我嘗試用下面的代碼來實現這一目標:如何找到曆元時間戳和std :: chrono :: system_clock :: now之間的時間差(以毫秒爲單位)

#include <iostream> 
#include <chrono> 

using namespace std; 

int main() 
{ 
auto epoch1 = std::chrono::system_clock::now().time_since_epoch() ; 
auto epoch2= std::chrono::duration<long long>(epoch_time_stamp); 
auto diff = epoch1 - epoch2 ; 
auto s = std::chrono::duration_cast<std::chrono::milliseconds>(diff); 
cout << s.count() << endl; 
} 

凡epoch_time_stamp是13位時代的時間戳e.x 1501190040123.
但是我得到錯誤的結果。我嘗試將epoch_time_stamp同時作爲int64_t和time_t傳遞,但沒有成功。由於我在使用std :: chrono方面頗爲新穎,因此我認爲epoch2的投射不正確。

任何想法我該怎麼辦?

回答

1

正如您可能已經知道的那樣,您的epoch_time_stamp是自1970-01-01 00:00:00 UTC以來的毫秒數。當你說:

auto epoch2= std::chrono::duration<long long>(epoch_time_stamp); 

你正在悄然轉換的milliseconds該計數成seconds計數。你可以把它轉換成的milliseconds與計數:

auto epoch2= std::chrono::duration<long long, std::milli>(epoch_time_stamp); 

然後,我想你會開始得到的結果,看起來你的權利。

我發現它有助於創建一個使用別名模板是這樣的:

template <class D> 
using sys_time = std::chrono::time_point<std::chrono::system_clock, D>; 

現在sys_time<milliseconds>time_point它計算milliseconds以來的時代。這將允許您簡化代碼到:

auto remote_time = sys_time<milliseconds>{milliseconds{epoch_time_stamp}}; 
cout << duration_cast<milliseconds>(system_clock::now() - remote_time).count() << "ms\n"; 

爲更多細節<chrono>,請參閱本video tutorial

0

的複雜的答案:

auto epoch2 = decltype(std::chrono::system_clock::now().time_since_epoch())(epoch_time_stamp); 

越容易回答:

auto epoch2 = std::chrono::milliseconds(epoch_time_stamp); 

即可正確之嫌。在聲明持續時間中缺失的是比率(也稱爲單位)。在這種情況下,它應該是std :: milli;而using milliseconds = duration<long long, milli>;這給出了更簡單的答案。

複雜的答案是確定std::chrono::system_clock::now().time_since_epoch()返回的類型,然後調用具有紀元時間戳的類型的構造函數。

相關問題