簡體   English   中英

C++ 打印 chrono::time_point<chrono::high_resolution_clock> 可讀</chrono::high_resolution_clock>

[英]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_clocktime_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.

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