[英]std::atomic<std::chrono::high_resolution_clock::time_point> can not compile
[英]C++ print chrono::time_point<chrono::high_resolution_clock> to be readable
我有自 Epoch 以來的納秒數,我想打印它以便閱讀。
我發現在線打印time_point
的示例是使用system_clock
然后轉換為std::time_t
。 但是,我正在使用high_resolution_clock
(因為納秒),因此很難理解如何打印它。
鑒於我正在處理納秒,最好的技術是什么? 如果可能的話,我寧願堅持使用標准庫。
我現在堅持使用 C++17,但請提及 C++20 是否使這更容易做到。
#include <chrono>
#include <iostream>
using Clock = std::chrono::high_resolution_clock;
using TimePoint = std::chrono::time_point<Clock>;
int main()
{
const uint64_t nanosSinceEpoch = 1517812763001883383;
const Clock::duration duration_ns_since_epoch = std::chrono::nanoseconds(nanosSinceEpoch);
const TimePoint tp(duration_ns_since_epoch);
// Would like to print tp in readable format
}
high_resolution_clock
沒有可移植的紀元。 可能是 1970 年。可能是您的設備啟動時。 因此,在打印time_point
時,可以做的最好的事情就是打印底層的持續時間。
即使system_clock::time_point
沒有, system_clock
也可以表示nanoseconds
。 訣竅是使用更通用的time_point
形式,即:
template <class Clock, class Duration>
class time_point;
您可以指定時鍾和持續時間,例如:
time_point<system_clock, nanoseconds> tp;
我喜歡設置一個模板化的類型別名來做到這一點:
template <class Duration>
using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
現在我可以使用這個更簡單的語法:
sys_time<nanoseconds> tp;
在 C++20 中, sys_time
由<chrono>
為您提供。 C++20 允許您簡單地打印出基於system_clock
的time_point
。
不幸的是,我不相信有人正在發布 C++20 的這一部分。 但是,有一個C++20 <chrono>
的僅標頭、開源、免費預覽版,適用於 C++11/14/17:
#include "date/date.h"
#include <chrono>
#include <iostream>
int main()
{
const uint64_t nanosSinceEpoch = 1517812763001883383;
const std::chrono::nanoseconds d(nanosSinceEpoch);
using date::operator<<;
std::cout << date::sys_time<std::chrono::nanoseconds>{d} << '\n';
}
Output:
2018-02-05 06:39:23.001883383
在 header tz.h 的同一鏈接中有第二個<chrono>
預覽庫,它處理時區。 這個庫不是只有標題的。 有一個與之關聯的源文件 tz.cpp。 以下是編譯它的說明。
該庫可用於將sys_time
(又名Unix 時間/UTC)轉換為任何IANA 時區。
例如,如果您需要在“America/Chicago”中顯示上述 output(即使您的計算機不在芝加哥),那么可以這樣完成:
#include "date/tz.h"
#include <chrono>
#include <iostream>
int main()
{
const uint64_t nanosSinceEpoch = 1517812763001883383;
using namespace std::chrono;
date::sys_time<nanoseconds> tp{nanoseconds(nanosSinceEpoch)};
std::cout << date::zoned_time{"America/Chicago", tp} << '\n';
}
Output:
2018-02-05 00:39:23.001883383 CST
這也是 C++20 <chrono>
的一部分。 zoned_time
是時區和sys_time
的配對,只要是秒或更精確,任何精度。 其流式運營商包括時區縮寫。 還有一種format
function(C++20 中的std::format
,庫中的date::format
)可用於自定義 output。 例如:
date::zoned_time zt{"America/Chicago", tp};
std::cout << date::format("%F %T%z", zt) << '\n';
Output:
2018-02-05 00:39:23.001883383-0600
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.