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

Posted

技术标签:

【中文标题】如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时间差(以毫秒为单位)【英文标题】:How to find the time difference in milliseconds between an epoch timestamp and std::chrono::system_clock::now 【发布时间】:2018-01-03 20:17:44 【问题描述】:

大家好,我创建了一个 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 位的纪元时间戳,例如 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&lt;milliseconds&gt; 是一个time_point,它从纪元开始计数milliseconds。这将允许您将代码简化为:

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

有关&lt;chrono&gt;的更多详细信息,请参阅此video tutorial。

【讨论】:

【参考方案2】:

复杂的答案:

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&lt;long long, milli&gt;; 则给出了更简单的答案。

复杂的答案是确定std::chrono::system_clock::now().time_since_epoch()返回的类型,然后使用纪元时间戳调用该类型的构造函数。

【讨论】:

以上是关于如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时间差(以毫秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 shell 脚本中找到比当前时间早 30 天的纪元时间?

在 C# 中计算未来纪元时间

如何在 Perl 中将 dd/mm/yyyy 转换为纪元时间?

如何从 Perl 中的随机纪元时间戳获取纪元形式的月份开始?

如何在javascript中将给定的日期和时间转换为纪元时间?

如何在python中确定视频的开始时间和结束时间(自纪元以来的秒数)?