Сегодня я работал с некоторыми функциями времени и заметил, что стандартное преобразование с использованием %r
(или %p
), похоже, не работает для ввода через std::get_time()
в g++ или clang++. Смотрите эту версию живого кода для g++ и clang++. Кажется, он работает как ожидается в Windows с VС++ (см. Этот близкий вопрос). Также обратите внимание, что эффект тот же, независимо от того, включена ли строка imbue
. Локаль на моей машине Linux установлен на "en_US.UTF-8"
, если это имеет значение.
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <ctime>
int main(){
std::tm t{};
std::stringstream ss{"1:23:45 PM"};
ss.imbue(std::locale(std::cin.getloc(),
new std::time_get_byname<char>("en_US")));
ss >> std::get_time(&t, "%r");
if (ss.fail()) {
std::cout << "Conversion failed\n" << std::put_time(&t, "%r") << '\n';
} else {
std::cout << std::put_time(&t, "%r") << '\n';
}
}