快速将std :: chrono :: time_point转换为std :: string

时间:2017-03-02 11:14:56

标签: c++ string datetime c++17 chrono

如何无法区域设置std::chrono::time_point转换为预定义日期时间格式std::string的{​​{1}}? / p>

For me it turned out唯一的方法是将YYYY-mm-dd HH:MM:SS.zzzzzzzzzstd::get_timestd::put_timestd::itringstream一起使用,但是:

  • 前两个有std::ostringstreamstd::tm的C风格界面(可忍受)
  • 最后两个是慢的,time_t依赖(至关重要)。

还有其他选择吗?

也可以考虑第三方库。我查看了std::locale,但接缝也依赖于区域设置,而且它比boost::posix_time::ptime更慢且更不通用。

1 个答案:

答案 0 :(得分:2)

不知道它是否足够快,但是:

#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"部分仅限标题。有full documentation,甚至视频教程都与GitHub page相关联。

有相当广泛的格式化和解析选项,以及许多其他功能,可以安全,轻松地进行时间和日历计算。

此外,如果这种格式化速度不够快,那么该库将灵活分层,以便您可以在较低级别与其进行交互,并轻松编写自己的I / O.例如,以下是如何将{em>所有字段类型从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之前,这里有一个关于{}的编译器错误。请改用()来解决编译器错误。

反向(从intsystem_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

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