2013-06-25 12 views
7

ich mit Microsoft Visual Studio 2012 arbeitete, und betrachtete std::put_time verwenden, so habe ich das folgende Beispiel:MSVCs Implementierung von 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; 
} 

Dies erzeugt die folgende Ausgabe:

06/25/2013 

Welches ist nicht das Datumsformat, das ich von der Gebietsschema en-GB erwarten würde. Ich habe auch versucht:

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

Aber wieder, mit dem gleichen Ausgang. Ist das die Ausgabe, die ich für dieses Gebietsschema erhalten soll, oder habe ich irgendwo einen Fehler gemacht?

+0

Das ist definitiv falsch. –

+0

@ R.MartinhoFernandes Wissen Sie, ob dies in der Microsoft-Fehlerdatenbank gespeichert wurde? –

Antwort

4

Arbeiten wie vorgesehen. std::put_time funktioniert nicht im Gebietsschema des Streams, nicht im globalen Gebietsschema. cout wird erstellt und mit dem aktuellen globalen Gebietsschema versehen, bevor main eingegeben wird. Die nachfolgende Änderung der globalen Ländereinstellung hat keine Auswirkungen darauf. Sie müssen imbue() es explizit.

+0

Also warum dann 'std :: cout.imbue (std :: locale (" en-GB "))' vor der Verwendung von 'std :: put_time' das gleiche Ergebnis liefern? –

+0

Wahrscheinlich, weil "en-GB" kein Gebietsschema-Bezeichner ist, den die MSVC-Implementierung von "std :: locale" erkennt (beachten Sie, dass der Standard die Form dieser Zeichenfolge nicht angibt). "English_Britain" funktioniert für mich, da die Ausgabe im Format Tag/Monat/Jahr erfolgt. –

+0

Ahh, das klärt die Dinge. Vielen Dank!! +1 –

Verwandte Themen