Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::chrono::time_点快速转换为std::string或从std::string转换为std::chrono::time_点_C++_String_Datetime_C++17_Chrono - Fatal编程技术网

C++ 将std::chrono::time_点快速转换为std::string或从std::string转换为std::chrono::time_点

C++ 将std::chrono::time_点快速转换为std::string或从std::string转换为std::chrono::time_点,c++,string,datetime,c++17,chrono,C++,String,Datetime,C++17,Chrono,如何将std::chrono::time_点转换为std::string预定义的日期时间格式YYYY-mm-dd HH:mm:SS.zzzzzzz 唯一的方法是将std::get_time和std::put_time与std::itringstream和std::ostringstream一起使用,但是: 前两个具有C风格的接口,带有std::tm和time\u t(可承受) 最后两个比较慢,并且依赖于std::locale(至关重要) 还有其他选择吗 也可以考虑使用第三方库。我查看了boo

如何将
std::chrono::time_点
转换为
std::string
预定义的日期时间格式
YYYY-mm-dd HH:mm:SS.zzzzzzz

唯一的方法是将
std::get_time
std::put_time
std::itringstream
std::ostringstream
一起使用,但是:

  • 前两个具有C风格的接口,带有
    std::tm
    time\u 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';
}
这是我写的图书馆。它是免费的、开源的,
“date.h”
部分仅为标题。有,甚至视频教程,所有链接关闭的

有相当广泛的格式和解析选项,以及许多其他功能,使时间和日历计算变得安全和容易

此外,如果这种格式对您来说不够快,那么库将灵活分层,以便您可以在较低的级别与它交互,并轻松编写自己的I/O。例如,下面是如何从
系统时钟::时间点
到微秒精度,获得所有字段类型,如
int

#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
s,然后可以在单个语句中形成
system\u clock::time\u point


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

这基本上是一个“为我找到一个库”的问题。但是事实证明,有一个建议用于C++20标准化。由Howard Hinnant制作,他是
chrono
标准库组件的幕后推手。他甚至很和蔼地说:)@Nicolas,为什么不把它变成一个答案呢?@D\N:因为这是一个应该结束的问题。我正在寻找一种C++17语言环境独立转换函数的
std::from_chars
std::to_chars
的重载。流依赖于区域设置,因此
“chrono\u io.h”
不会有帮助。@Vahagn:最坏情况:您可以仅在
时间点
y/m/d h:m:s
转换(反之亦然)和输入/输出这些字段的整数值时使用此库。此库是这些非常高效(非迭代)转换函数的类型安全包装器:
#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();
}
#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};
}