快速转换标准::时间::time_point 到/从标准::字符串

Fast converting std::chrono::time_point to/from std::string

本文关键字:标准 字符串 point time 转换 时间      更新时间:2023-10-16

如何在预定义的日期时间格式YYYY-mm-dd HH:MM:SS.zzzzzzzzzstd::string之间无区域设置地将std::chrono::time_point转换为预定义的日期时间格式?

对我来说,事实证明,唯一的方法是将std::get_timestd::put_timestd::itringstreamstd::ostringstream一起使用,但是:

  • 前两个具有C式界面,具有std::tmtime_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。 例如,下面介绍如何将所有字段类型作为intsystem_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

该库有一个活跃的用户社区,有助于在多个平台上维护它。