大家好我创建了一个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的强制转换不正确。
任何想法我应该怎么做?
答案 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()
返回的类型,然后调用带有纪元时间戳的类型的构造函数。