2017-07-27 53 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()返回的类型,然后调用具有纪元时间戳的类型的构造函数。

相关问题