c++ - C++ 打印 chrono::time_point可读
问题描述
我有自 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 的这一部分。但是,有一个仅标头、开源、免费的 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
更新地址时区
在标题 tz.h 的同一链接中还有第二个<chrono>
预览库,它处理时区。这个库不是只有标题的。有一个与之关联的源文件 tz.cpp。 以下是编译它的说明。
该库可用于将sys_time
(又名Unix 时间/UTC)转换为任何IANA 时区。
例如,如果您需要在“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
是 time zone 和 a 的配对,sys_time
具有任何精度,只要它是秒或更精细。其流式运营商包括时区缩写。还有一个format
函数(std::format
在 C++20 中,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
推荐阅读
- ios - Linking.openUrl 在 IOS 中发送短信
- google-cloud-platform - 在已安装 pytorch 和 Cuda10 的 Google Cloud Vm 中没有明显的 GPU 使用情况
- c - 关于使用函数、指针和动态分配的练习 (C)
- node.js - firestore 云功能缺少一些 onCreate 文档
- swift - 在 Swift 中录制视频时如何添加叠加层?
- python - 如何每天发出 1 个请求?
- python - SparkSession.conf 和 SparkConf 有什么区别?
- rust - 如何比较两个指针?
- java - 如何构建与包含子字符串中所有字符的任何字符串匹配的正则表达式?
- python - NameError:名称'master'未定义