Разбор C ++ YYMMDD Строка даты ISO 8601 с std :: get_time дает неожиданный результат?

Я пытаюсь разобрать дату в формате 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';
}
}

Протестировано с Coliru, GCC 6.1 (C ++ 17), вывод:

Sun Mar  0 00:00:00 1912

То, что я ожидал, это:

Mon Dec 3 00:00:00 2019

Что-то не так в строке формата?

4

Решение

Вы могли бы использовать Бесплатная библиотека даты / времени Говарда Хиннанта с открытым исходным кодом как это:

#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';
}

Это работает на GCC 6.1: http://melpon.org/wandbox/permlink/gy3wpMXeCoxk9Ykj (как и другие платформы). За исключением правильного вывода:

Tue Dec  3 00:00:00 2019
1

Другие решения

Это не ошибка. Вы столкнулись с артефактом 2000 год. tm_year в поле в std::tm Структура содержит количество лет с 1900 года. Поэтому, естественно, к какому бы значению год вы ни добавили, оно будет добавлено к 1900 году. date на самом деле следуйте спецификации POSIX и ведите себя соответственно:

date -d'27 JUN 69' +%Y
1969
date -d'27 JUN 68' +%Y
2068
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector