Pracowałem z niektórymi funkcjami czasu dzisiaj i zauważyłem, że standardowa konwersja przy użyciu %r
(lub %p
) wydaje się nie działać dla danych wejściowych poprzez std::get_time()
na g ++ lub clang ++. Zobacz this live code version dla g ++ i clang ++. To ma wydaje się działać zgodnie z oczekiwaniami w systemie Windows z VC++ (zobacz ten closely related question). Zwróć też uwagę, że efekt jest taki sam niezależnie od tego, czy linia imbue
jest dołączona. Ustawienia regionalne na moim komputerze z systemem Linux są ustawione na "en_US.UTF-8"
, jeśli to ma znaczenie.Czy std :: get_time jest uszkodzony w g ++ i clang ++?
#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';
}
}
To wydaje się być problem z libstdC++. clang z libC++ parsuje to dobrze. –
@HowardHinnant: Jesteś [w prawo] (http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e). Czy powinienem powtórzyć pytanie? – Edward
Wygląda na [implementację] (https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facets_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654) nie obsługuje '% r' lub'% p'. Jeśli istnieje inne miejsce, w którym mają być obsługiwane, nie mogę go znaleźć. – interjay