簡體   English   中英

如何找到紀元時間戳和 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 位的紀元時間戳,例如 1501190040123。
但是我得到了錯誤的結果。 我試圖將 epoch_time_stamp 作為 int64_t 和 time_t 傳遞但沒有成功。由於我對使用 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>更多詳細信息,請參閱此視頻教程

復雜的答案:

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()返回的類型,然后使用紀元時間戳調用該類型的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM