如何将std::chrono::time_point
转换为字符串?
例如:"201601161125"
。
答案 0 :(得分:8)
Howard Hinnant's free, open source, header-only, portable date/time library是一种现代化的方法,可以通过旧的C API进行流量传输,并且不要求您丢弃所有亚秒级信息。该库也是proposed for standardization。
格式化有很多灵活性。最简单的方法就是流出:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
std::cout << std::chrono::system_clock::now() << '\n';
}
这只是我的输出:
2017-09-15 13:11:34.356648
需要using namespace date;
才能找到system_clock::time_point
的流媒体运营商(我的lib将其插入namespace std::chrono
是不合法的)。此格式不会丢失任何信息:将输出system_clock::time_point
的完整精度(microseconds
我在macOS上运行它。)
strftime
-like formatting flags的完整套件可用于其他格式,带有小扩展以处理小数秒等事情。这是另一个以毫秒精度输出的示例:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << format("%D %T %Z\n", floor<milliseconds>(system_clock::now()));
}
只为我输出:
09/15/17 13:17:40.466 UTC
答案 1 :(得分:6)
最灵活的方法是将其转换为struct tm
,然后使用strftime
(就像sprintf
一样)。类似的东西:
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::tm now_tm = *std::localtime(&now_c);
/// now you can format the string as you like with `strftime`
查看strftime
here的文档。
如果您有localtime_s
或localtime_r
可用,则应优先使用localtime
。
还有很多其他方法可以做到这一点,但是,虽然这些方法更容易使用,但这些方法会产生一些预定义的字符串表示。你可以隐藏&#34;所有上述功能都是为了便于使用。
答案 2 :(得分:0)
以下函数将chrono
time_point
转换为字符串(序列化)。
#include <chrono>
#include <iomanip>
#include <sstream>
using time_point = std::chrono::system_clock::time_point;
std::string serializeTimePoint( const time_point& time, const std::string& format)
{
std::time_t tt = std::chrono::system_clock::to_time_t(time);
std::tm tm = *std::gmtime(&tt); //GMT (UTC)
//std::tm tm = *std::localtime(&tt); //Locale time-zone, usually UTC by default.
std::stringstream ss;
ss << std::put_time( &tm, format.c_str() );
return ss.str();
}
// example
int main()
{
time_point input = std::chrono::system_clock::now();
std::cout << serializeTimePoint(input, "UTC: %Y-%m-%d %H:%M:%S") << std::endl;
}
time_point
数据类型没有时区的内部表示,因此,时区是通过转换为std::tm
(通过函数gmtime
或localtime
)。不建议从输入中添加/减去时区,因为使用%Z
会显示不正确的时区,因此最好设置正确的本地时间(取决于OS)并使用localtime()
。
对于技术用途,硬编码的时间格式是一个很好的解决方案。但是,要向用户显示,应该使用locale
来检索用户首选项并以这种格式显示时间戳。
从C ++ 20开始,我们对time_point和duration具有很好的序列化和解析功能。
std::chrono::to_stream
std::chrono::format