如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时间差(以毫秒为单位)
How to find the time difference in milliseconds between an epoch timestamp and std::chrono::system_clock::now
大家好,我创建了一个 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 传递,但没有 success.Since 我对使用 std::chrono 很陌生,我假设 epoch2 的演员表是不正确。
有什么想法吗?
您可能已经知道,您的 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。
复杂的答案:
auto epoch2 = decltype(std::chrono::system_clock::now().time_since_epoch())( epoch_time_stamp );
更简单的答案:
auto epoch2 = std::chrono::milliseconds( epoch_time_stamp );
所以你猜对了。持续时间声明中缺少比率(也称为 unit)。在这种情况下,它应该是 std::milli; using milliseconds = duration<long long, milli>;
给出了更简单的答案。
复杂的答案是确定std::chrono::system_clock::now().time_since_epoch()
返回的类型,然后调用具有纪元时间戳的类型的构造函数。
大家好,我创建了一个 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 传递,但没有 success.Since 我对使用 std::chrono 很陌生,我假设 epoch2 的演员表是不正确。
有什么想法吗?
您可能已经知道,您的 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。
复杂的答案:
auto epoch2 = decltype(std::chrono::system_clock::now().time_since_epoch())( epoch_time_stamp );
更简单的答案:
auto epoch2 = std::chrono::milliseconds( epoch_time_stamp );
所以你猜对了。持续时间声明中缺少比率(也称为 unit)。在这种情况下,它应该是 std::milli; using milliseconds = duration<long long, milli>;
给出了更简单的答案。
复杂的答案是确定std::chrono::system_clock::now().time_since_epoch()
返回的类型,然后调用具有纪元时间戳的类型的构造函数。