2013-06-25 8 views
7

pracuję z Microsoft Visual Studio 2012, i patrzył na użyciu std::put_time, więc stworzyłem następujący przykład:MSVCs Implementacja std :: put_time

int main() 
{ 
    std::time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); 

    std::locale::global(std::locale("en-GB")); 

    std::cout << std::put_time(std::localtime(&t), "%x") << std::endl; 
} 

To daje następujący wynik:

06/25/2013 

Nie jest to format daty, którego można się spodziewać po ustawieniu narodowym en-GB. Próbowałem również:

std::cout.imbue(std::locale("en-GB")); 

Ale znowu, z tym samym wyjściem. Czy to jest wynik, który powinienem uzyskać dla tego locale, czy gdzieś się pomyliłem?

+0

To zdecydowanie źle. –

+0

@ R.MartinhoFernandes Czy wiesz, czy zostało to zapisane w bazie danych błędów Microsoftu? –

Odpowiedz

4

Działaj zgodnie z przeznaczeniem. std::put_time działa poza lokalnym ustawieniem strumienia, a nie globalnym ustawieniem narodowym. Utworzono cout i nasycono bieżącym globalnym locale przed wprowadzeniem main. Późniejsze zmiany globalnych ustawień narodowych nie mają na nie wpływu. Musisz jednoznacznie oznaczyć to jako imbue().

+0

Dlaczego więc 'std :: cout.imbue (std :: locale (" en-GB "))' przed użyciem 'std :: put_time' daje taki sam wynik? –

+0

Prawdopodobnie dlatego, że "en-GB" nie jest identyfikatorem locale, który rozpoznaje implementacja 'std :: locale' przez MSVC (zauważ, że standard nie określa formy tego łańcucha). "English_Britain" działa dla mnie, ponieważ wynik jest w formacie dzień/miesiąc/rok. –

+0

Ach, racja, to wyjaśnia. Dziękuję Ci bardzo!! +1 –