【发布时间】:2016-09-29 21:30:16
【问题描述】:
我今天正在处理一些时间函数,并注意到使用%r(或%p)的标准转换似乎不适用于在g++ 或clang++ 上通过std::get_time() 进行的输入。有关 g++ 和 clang++,请参阅 this live code version。它确实似乎在使用 VC++ 的 Windows 下按预期工作(请参阅closely related question)。另请注意,无论是否包含imbue 行,效果都是相同的。如果重要的话,我的 Linux 机器上的语言环境设置为 "en_US.UTF-8"。
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <ctime>
int main(){
std::tm t{};
std::stringstream ss{"1:23:45 PM"};
ss.imbue(std::locale(std::cin.getloc(),
new std::time_get_byname<char>("en_US")));
ss >> std::get_time(&t, "%r");
if (ss.fail()) {
std::cout << "Conversion failed\n" << std::put_time(&t, "%r") << '\n';
} else {
std::cout << std::put_time(&t, "%r") << '\n';
}
}
【问题讨论】:
-
这似乎是一个 libstdc++ 问题。使用 libc++ 的 clang 可以很好地解析。
-
@HowardHinnant:你是right。我应该重新命名问题吗?
-
看起来implementation 无法处理
%r或%p。如果还有其他地方应该处理它们,我找不到。