C++ print chrono::time_point<chrono::high_resolution_clock> 可读
C++ print chrono::time_point<chrono::high_resolution_clock> to be readable
我有自大纪元以来的纳秒数,我想打印它以便于阅读。
我找到的在线打印示例 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 at the same link in the header tz.h which deals with time zones. This library is not header-only. There's a single source file associated with it, tz.cpp. Here are directions for compiling it.
此库可用于翻译 sys_time
(又名 Unix Time / UTC) into any 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
我有自大纪元以来的纳秒数,我想打印它以便于阅读。
我找到的在线打印示例 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 at the same link in the header tz.h which deals with time zones. This library is not header-only. There's a single source file associated with it, tz.cpp. Here are directions for compiling it.
此库可用于翻译 sys_time
(又名 Unix Time / UTC) into any 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