[英]std::chrono::system_clock + now() to milliseconds and back different behavior
[英]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.