我正在尝试使用该<chrono>
库来解析 POSIX 日期和时间字符串,无论全局语言环境是什么,都基于以下代码:
#include <iostream>
#include <locale>
#include <sstream>
#include <string>
#include <chrono>
using namespace std;
void printPosixDateString(string const &str) {
istringstream stringStream{};
stringStream.str(str);
locale cLocale{"C"};//locale of C/POSIX language
stringStream.imbue(cLocale);
chrono::sys_seconds timeHolder{};//default value is unix time
stringStream >> chrono::parse("%c", timeHolder);
if(stringStream.fail()) {
cout << "Error while parsing date string : " << stringStream.str() << endl;
}
else {
cout << timeHolder;//should print the date object
}
}
int main(int argc, char **argv) {
locale french("fr_FR.UTF8");
locale::global(french);
cout.imbue(french);
printPosixDateString("Fri Jul 5 14:58:21 2019");//must work no matter the global locale
return 0;
}
问题是它总是打印"Error while parsing date string: Fri Jul 5 14:58:21 2019"
消息。
你对此有什么解释吗?
我在一台典型的 x86-64 计算机上使用 Arch Linux,内核:Linux 6.10.7-arch1-1。我使用 g++ 14.2.1,尝试使用 C++20 和 C++23(输出相同),并像这样构建我的文件:
g++ -std=c++20 -Wall -o main main.cpp
我手写了日期字符串,以防我错过一个看不见的奇怪字符。
我不想自己编写格式,因为我希望能够使用“%c”区域设置日期时间格式,以便我可以轻松更新此代码以将其应用于其他区域设置。
我原本期待这个输出:
2019-07-5 14:58:21
,但Error while parsing date string: Fri Jul 5 14:58:21 2019
每次尝试都只得到这个输出。
在我看来,这可能是 gcc 的一个错误。我建议提交错误报告。我注意到,如果您将其更改为“C”语言环境应扩展为的内容,您的代码就可以
"%c"
正常工作"%a %b %e %T %Y"
。%c