快速转换标准::时间::time_point 到/从标准::字符串
Fast converting std::chrono::time_point to/from std::string
如何在预定义的日期时间格式YYYY-mm-dd HH:MM:SS.zzzzzzzzz
std::string
之间无区域设置地将std::chrono::time_point
转换为预定义的日期时间格式?
对我来说,事实证明,唯一的方法是将std::get_time
和std::put_time
与std::itringstream
和std::ostringstream
一起使用,但是:
- 前两个具有C式界面,具有
std::tm
和time_t
(可以忍受) - 最后两个是缓慢的,
std::locale
依赖(关键)。
还有其他选择吗?
也可以考虑第三方库。我看了boost::posix_time::ptime
但接缝它也依赖于区域设置,而且它比std::chrono::time_point
更慢、更不通用。
不知道它对你来说是否足够快,但是:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
std::cout << std::chrono::system_clock::now() << 'n';
}
只是为我输出:
2017-03-02 17:04:26.813110
这是我写的一个库。 它是免费的,开源的,"date.h"
部分是仅标题的。 有完整的文档,甚至视频教程,所有这些都在GitHub页面上链接。
有相当广泛的格式化和解析选项,以及许多其他功能,这些功能使时间和日历计算变得安全且容易。
此外,如果此格式设置对您来说不够快,则库可以灵活分层,以便您可以在较低级别与其交互并轻松编写自己的 I/O。 例如,下面介绍如何将所有字段类型作为int
从system_clock::time_point
到微秒的精度
#include "date.h"
int
main()
{
using namespace date;
using namespace std::chrono;
auto t = system_clock::now();
// Convert system_clock::time_point to days-precision time_point
auto sd = floor<days>(t);
// Create time_of_day
auto tod = make_time(t - sd);
// Create year_month_day
year_month_day ymd = sd;
// Extract field types as int
int y = int{ymd.year()}; // Note 1
int m = unsigned{ymd.month()};
int d = unsigned{ymd.day()};
int h = tod.hours().count();
int M = tod.minutes().count();
int s = tod.seconds().count();
int us = duration_cast<microseconds>(tod.subseconds()).count();
}
现在,您可以根据需要格式化这些int
。
注1:在gcc-6.1之前,这里有一个关于{}
的编译器错误。请改用()
来解决编译器错误。
相反的方向(从int
秒到system_clock::time_point
)更容易:
#include "date.h"
int
main()
{
using namespace date;
using namespace std::chrono;
int y = 2017;
int m = 3;
int d = 2;
int h = 15;
int M = 33;
int s = 55;
int us = 123456;
// Convert field values to system_clock::time_point
system_clock::time_point t = sys_days(year{y}/m/d) + hours{h} + minutes{M} +
seconds{s} + microseconds{us};
}
根据需要解析int
,然后可以在单个语句中形成system_clock::time_point
。
该库有一个活跃的用户社区,有助于在多个平台上维护它。
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何初始化一个标准::字符串数组?
- 在命名管道中发送标准::字符串流
- 标准::字符串与空字符可能吗?
- 如何从标准::string_view正确创建标准::字符串?
- 从常量字符*、字符*参数到标准::字符串的直接转换接口
- 热将标准::__cxx11::字符串转换为标准::字符串
- 如何将字符*浅复制到标准::字符串?
- 十进制到八进制递归C++.以标准::字符串格式输出
- 如何通过标准字符串打印 ostream 变量的值?
- 如何使用 RPM 从内存中读取标准::字符串
- 我需要初始化标准::字符串吗?
- 标准地图如何知道使用标准字符串的数据作为键
- C++ - 从标准::字符串解析数字
- 如何调整标准::字符串的大小以删除所有空终止符字符?
- URL 编码扩展的 ASCII 标准::字符串在 C++.
- 将字符串::迭代器转换为标准::字符串
- 如何将标准::字符串内容克隆到新的 char[] 数组
- 如何将标准::字符串拆分为标准::string_views的范围 (v3)
- 标准::字符串中的内存泄漏