gpt4 book ai didi

c++ - gcc 6.3 和 clang 4.0 中的 std::get_time() 不适用于完整的月份名称

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:23 24 4
gpt4 key购买 nike

我想用 std::get_time() 解析日期字符串,但代码似乎适用于 VC++ 2015,但不适用于 gcc 6.3 和 clang 4.0。这是 MCVE:

#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>

int main() {

std::string line = "February 4 1993 15:21";

std::tm date_1 = {};

std::stringstream ss(line);

ss >> std::get_time(&date_1, "%b %d %Y %H:%M");

if(ss.fail())
{
std::cout << "parse failed\n";
}

std::cout << date_1.tm_year << "\n";
std::cout << date_1.tm_mon << "\n";
std::cout << date_1.tm_mday << "\n";
std::cout << date_1.tm_hour << "\n";
std::cout << date_1.tm_min << "\n";

return 0;
}

这是 VC++ 2015 的结果:

93
1
4
15
21

以下是 gcc 6.3.2 和 clang 4.0 的结果(我在 ideone.comColiru 上使用了编译器)——有和没有 c++14 标志:

parse failed
0
1
0
0
0

当我使用缩写的月份名称(例如 Feb、Aug 等)时,它确实有效。

我已经尝试在 stringstream(en_USen_GB + UTF-8 版本)上设置不同的语言环境,但它们要么没有任何区别,要么导致运行时错误。我试过更改分隔符,但也没有什么区别。

我读过CPP Reference std::get_time() 中的 %b:

parses the month name, either full or abbreviated, e.g. Oct

这是 gcc 和 clang 中的错误/缺失功能,还是编译器,与上面写的相反,根据实现仅自由处理缩写名称?标准对此有何规定?两个编译器在这里表现出相同的行为是巧合吗?

最佳答案

如评论中所述,这是一个 libstdc++ 错误。然而,没有注意到如何解决它。

使用 %B而不是 %b ,而 libstdc++ 将进行解析。用于解析,%B%b应该有相同的行为。但是对于格式化,%B %b 时输出语言环境的完整月份名称格式化缩写的月份名称。

最后,你可能对Howard Hinnant's free, open-source date-time library感兴趣这允许您直接解析为 <chrono>时间点和持续时间:

#include "date.h"
#include <iostream>
#include <sstream>

int
main()
{
using namespace date;
using namespace std::chrono;
std::istringstream in{"February 4 1993 15:21"};
sys_time<minutes> tp;
in >> parse("%B %d %Y %H:%M", tp);
if (in.fail())
return 1;
std::cout << tp << '\n';
}

输出:

1993-02-04 15:21

在上面的例子中sys_time<minutes>std::chrono::time_point<std::chrono::system_clock, std::chrono::minutes> 的类型别名.

关于c++ - gcc 6.3 和 clang 4.0 中的 std::get_time() 不适用于完整的月份名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45367577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com