C++ 使用 std::get_time 解析 YYMMDD ISO 8601 日期字符串给出了意外结果?

Val*_*84 5 c++ date-parsing

我正在尝试解析格式为 的日期YYMMDD。作为测试,我尝试了以下代码:

#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>

int main(){
    std::tm t = {};
    std::istringstream ss("191203");
    ss >> std::get_time(&t, "%y%m%d");
    if (ss.fail()){ 
        std::cout << "Parse failed\n";
    } else {
        std::cout << std::put_time(&t, "%c") << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 Coliru、GCC 6.1 (C++17) 进行测试,输出为:

Sun Mar  0 00:00:00 1912
Run Code Online (Sandbox Code Playgroud)

我所期望的是:

Mon Dec 3 00:00:00 2019
Run Code Online (Sandbox Code Playgroud)

格式字符串有问题吗?

How*_*ant 1

您可以使用Howard Hinnant 的免费开源日期/时间库,如下所示:

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

int
main()
{
    date::sys_days t;
    std::istringstream ss("191203");
    ss >> date::parse("%y%m%d", t);
    if (ss.fail())
        std::cout << "Parse failed\n";
    else
        std::cout << date::format("%c", t) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

它适用于 gcc 6.1: http://melpon.org/wandbox/permlink/gy3wpMXeCoxk9Ykj(以及其他平台)。除了正确的输出是:

Tue Dec  3 00:00:00 2019
Run Code Online (Sandbox Code Playgroud)