针对 musl 和 glibc 将 data/time 转换为 tm/time_point。一般的方法
convert data/time to tm/time_point against musl and glibc. Common way
我想将字符串数据转换为 struct tm
(c) 或 std::chrono::time_point
。问题是我想为标准 libc(glibc 和 musl)提供工作解决方案。我有我想要解析的树标准格式。
RFC-1123
Sun, 06 Nov 1994 08:49:37 GMT
RFC-850
"Sunday, 06-Nov-94 08:49:37 GMT"
ANSI C 的 asctime 格式
Sun Nov 6 08:49:37 1994"
有什么办法让它起作用吗? std::get_time
有一个 bug
strptime
在 glibc 上工作良好(而且很快),但在 musl 上失败。
有什么想法吗?我不想像 get_time
那样使用流。但如果有必要,那很好。 (用GCC5>和c++11标准就可以了)
Howard Hinnant's free, open source, header-only, date/time library 可以将这些格式解析为 std::chrono::time_point
,即使在有故障的 get_time
和 strptime
设施的情况下也是如此。不过,它确实需要使用 std::istringstream
。这是它的样子:
#include "date.h"
#include <sstream>
std::chrono::system_clock::time_point
parse_RFC_1123(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a, %d %b %Y %T %Z", tp);
return tp;
}
std::chrono::system_clock::time_point
parse_RFC_850(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a, %d-%b-%y %T %Z", tp);
return tp;
}
std::chrono::system_clock::time_point
parse_asctime(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a %b %d %T %Y", tp);
return tp;
}
可以这样练习:
#include <iostream>
int
main()
{
auto tp = parse_RFC_1123("Sun, 06 Nov 1994 08:49:37 GMT");
using namespace date;
std::cout << tp << '\n';
tp = parse_RFC_850("Sunday, 06-Nov-94 08:49:37 GMT");
std::cout << tp << '\n';
tp = parse_asctime("Sun Nov 6 08:49:37 1994");
std::cout << tp << '\n';
}
并输出:
1994-11-06 08:49:37.000000
1994-11-06 08:49:37.000000
1994-11-06 08:49:37.000000
解析标志 %a
和 %b
通常依赖于语言环境。但是,如果您使用 -DONLY_C_LOCALE=1
编译此库,它将变为 与区域设置无关的 。它应该 给出相同的结果。但是从实际的角度来看,如果你编译 without -DONLY_C_LOCALE=1
而你没有得到上面的结果,你必须向你的 std::lib 供应商提交错误报告.
如果你用 -DONLY_C_LOCALE=1
编译,但没有得到上面的结果,请敲响我的笼子,我会在几天内修复它,如果不是几个小时的话.
我想将字符串数据转换为 struct tm
(c) 或 std::chrono::time_point
。问题是我想为标准 libc(glibc 和 musl)提供工作解决方案。我有我想要解析的树标准格式。
RFC-1123
Sun, 06 Nov 1994 08:49:37 GMT
RFC-850
"Sunday, 06-Nov-94 08:49:37 GMT"
ANSI C 的 asctime 格式
Sun Nov 6 08:49:37 1994"
有什么办法让它起作用吗? std::get_time
有一个 bug
strptime
在 glibc 上工作良好(而且很快),但在 musl 上失败。
有什么想法吗?我不想像 get_time
那样使用流。但如果有必要,那很好。 (用GCC5>和c++11标准就可以了)
Howard Hinnant's free, open source, header-only, date/time library 可以将这些格式解析为 std::chrono::time_point
,即使在有故障的 get_time
和 strptime
设施的情况下也是如此。不过,它确实需要使用 std::istringstream
。这是它的样子:
#include "date.h"
#include <sstream>
std::chrono::system_clock::time_point
parse_RFC_1123(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a, %d %b %Y %T %Z", tp);
return tp;
}
std::chrono::system_clock::time_point
parse_RFC_850(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a, %d-%b-%y %T %Z", tp);
return tp;
}
std::chrono::system_clock::time_point
parse_asctime(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a %b %d %T %Y", tp);
return tp;
}
可以这样练习:
#include <iostream>
int
main()
{
auto tp = parse_RFC_1123("Sun, 06 Nov 1994 08:49:37 GMT");
using namespace date;
std::cout << tp << '\n';
tp = parse_RFC_850("Sunday, 06-Nov-94 08:49:37 GMT");
std::cout << tp << '\n';
tp = parse_asctime("Sun Nov 6 08:49:37 1994");
std::cout << tp << '\n';
}
并输出:
1994-11-06 08:49:37.000000
1994-11-06 08:49:37.000000
1994-11-06 08:49:37.000000
解析标志 %a
和 %b
通常依赖于语言环境。但是,如果您使用 -DONLY_C_LOCALE=1
编译此库,它将变为 与区域设置无关的 。它应该 给出相同的结果。但是从实际的角度来看,如果你编译 without -DONLY_C_LOCALE=1
而你没有得到上面的结果,你必须向你的 std::lib 供应商提交错误报告.
如果你用 -DONLY_C_LOCALE=1
编译,但没有得到上面的结果,请敲响我的笼子,我会在几天内修复它,如果不是几个小时的话.