std :: get_time не анализировал день - PullRequest
0 голосов
/ 29 мая 2018

Если я пытаюсь установить день в tm с помощью std::get_time, то ничего не происходит, но входной поток находится в состоянии сбоя, что означает, что произошла ошибка анализа.

Что не таксо следующим кодом?

{   // setting time works
    std::tm t{};
    std::istringstream ss("01:02:03");
    ss.imbue(std::locale("de_DE"));
    ss >> std::get_time(&t, "%H:%M:%S");
    std::cout << ss.fail() << std::endl;
    std::cout << std::put_time(&t, "%c") << '\n';
}   

{   // setting day of month did not work
    std::tm t{};
    std::istringstream ss("2");
    ss.imbue(std::locale("de_DE"));
    ss >> std::get_time(&t, "%d");
    std::cout << ss.fail() << std::endl;
    std::cout << std::put_time(&t, "%c") << '\n';
} 

Вывод:

0 
Sun Jan  0 01:02:03 1900
1
Sun Jan  0 00:00:00 1900

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Я не уверен в этом и подозреваю, что это ошибка в вашей реализации libstdc ++.

Давайте посмотрим на документацию для спецификатора %d в cppreference

Разбирает день месяца как десятичное число (диапазон [01,31]), допускаются начальные нули, но не обязательны

Ваш код не выполняется, но если вы делаетевместо этого:

std::istringstream ss("02");

Это будет отлично скомпилировать .Когда я пробую это на моей локальной машине с g ++ 5.4, это выдаст ту же ошибку.Вы можете попробовать это с более новым gcc / libstdc ++

0 голосов
/ 29 мая 2018

Вам нужно передать ведущий ноль в день:

std::istringstream ss("02");

РЕДАКТИРОВАТЬ: Теперь я замечаю, что в соответствии с cppreference :

анализирует день месяца как десятичное число (диапазон [01,31]), ведущие нули разрешены, но не обязательны .

Может быть, это ошибка?

РЕДАКТИРОВАТЬ: Отчет об ошибке здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...