我正在尝试使用
<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"
消息。
请问您对此有什么解释吗?
我使用的是 Arch Linux,内核:Linux 6.10.7-arch1-1,在典型的 x86-64 计算机上。 我使用 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 bug。 我推荐一个错误报告。 我注意到,如果您将
"%c"
更改为 "%a %b %e %T %Y"
,那么您的代码就可以工作,这就是 %c
应扩展为“C”语言环境的内容。