为什么 chrono::parse 无法解析 POSIX 日期和时间字符串?

问题描述 投票:0回答:1

我正在尝试使用

<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

c++ locale stringstream c++-chrono
1个回答
0
投票

对我来说这可能是一个 gcc bug。 我推荐一个错误报告。 我注意到,如果您将

"%c"
更改为
"%a %b %e %T %Y"
,那么您的代码就可以工作,这就是
%c
应扩展为“C”语言环境的内容。

© www.soinside.com 2019 - 2024. All rights reserved.