如何找到纪元时间戳和std :: chrono :: system_clock :: now之间的时间差(以毫秒为单位)

时间:2017-07-27 22:27:12

标签: c++ epoch chrono

大家好我创建了一个c ++应用程序,其中包括使用std :: chrono来计算时差。
在某些时候,我将文件上传到服务器,作为响应,我从receive.php获取一个纪元时间戳,通知有关文件完全上传到服务器的时间戳。我想计算这个纪元时间戳和我选择的起点之间的时间差异,因为我不应该改变这种receive.php的工作方式。 到目前为止,我尝试使用以下代码实现此目的:

#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的强制转换不正确。

任何想法我应该怎么做?

2 个答案:

答案 0 :(得分:1)

您可能已经知道,footer是自1970-01-01 00:00:00 UTC以来的毫秒数。当你说:

epoch_time_stamp

您正在悄悄地将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"; 的详细信息,请参阅此video tutorial

答案 1 :(得分: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()返回的类型,然后调用带有纪元时间戳的类型的构造函数。