gpt4 book ai didi

C++ 打印 chrono::time_point 可读

转载 作者:行者123 更新时间:2023-12-01 14:22:29 36 4
gpt4 key购买 nike

我有自 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可以代表nanoseconds即使 system_clock::time_point才不是。诀窍是使用更通用的形式 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 s。
不幸的是,我不相信有人会发布 C++20 的这一部分。但是有一个 header-only, open source, free preview of 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';
}
输出:
2018-02-05 06:39:23.001883383
更新以解决时区问题
有一个 second <chrono> preview library在处理时区的标题 tz.h 中的同一链接中。这个库不是只有头文件。有一个与之关联的源文件 tz.cpp。 Here are directions for compiling it.
这个库可以用来翻译 sys_time (又名 Unix Time/UTC)到任何 IANA time zone .
例如,如果您需要在“America/Chicago”中显示上述输出(即使您的计算机不在芝加哥),则可以这样做:
#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';
}
输出:
2018-02-05 00:39:23.001883383 CST
这也是 C++20 <chrono> 的一部分. zoned_time是时区和 sys_time 的配对, 任何精度,只要它是秒或更细。它的流操作符包括时区缩写。还有一个 format可用于自定义输出的函数(C++20 中的 std::format,库中的 date::format)。例如:
date::zoned_time zt{"America/Chicago", tp};
std::cout << date::format("%F %T%z", zt) << '\n';
输出:
2018-02-05 00:39:23.001883383-0600

关于C++ 打印 chrono::time_point<ch​​rono::high_resolution_clock> 可读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62954221/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com