2013-06-25 3 views
7

Я работаю с Microsoft Visual Studio 2012, и смотрел на использование std::put_time, поэтому я создал следующий пример:MSVCs Реализация станд :: 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; 
} 

Это производит следующий вывод:

06/25/2013 

Какой формат даты я бы ожидал от локали en-GB. Я также пробовал:

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

Но опять же, с таким же выходом. Это то, что я должен получить для этой локали, или я где-то ошибся?

+0

Это определенно неправильно. –

+0

@ R.MartinhoFernandes Знаете ли вы, было ли это зарегистрировано в базе данных ошибок Microsoft? –

ответ

4

Работа по назначению. std::put_time работает вне локали потока, а не глобального локали. cout создан и пронизан текущим глобальным языковым стандартом до ввода main. Последующее изменение к глобальному языку не влияет на него. Вы должны явно указать imbue().

+0

Так почему же тогда 'std :: cout.imbue (std :: locale (« en-GB »))' перед использованием 'std :: put_time' дает тот же результат? –

+0

Вероятно, потому что «en-GB» не является идентификатором языка, который реализует реализация MSVC 'std :: locale' (обратите внимание, что стандарт не определяет форму этой строки). «English_Britain» работает для меня, поскольку итоговый результат в формате день/месяц/год. –

+0

Ах, да, это проясняет ситуацию. Большое спасибо!! +1 –

Смежные вопросы