Я провел небольшое исследование по этому вопросу, и у меня есть довольно убедительные доказательства ответа ДА, и ответ НЕТ. Я не уверен, с какой стороны верить.
Во-первых, документация, которую я нашел на cppreference.com, и http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf, похоже, ничего не говорит об этом. Я считаю это доказательством того, что локали НЕ поддерживают часовой пояс.
Но https://en.cppreference.com/w/cpp/locale/time_get/get и https://en.cppreference.com/w/cpp/locale/time_put/put говорят:
% z записывает смещение от UTC в формате ISO 8601 (например, -0430) или без символов, если информация о часовом поясе недоступна.% Z записывает имя или аббревиатуру часового пояса или без символов, если информация о часовом поясе недоступна ( зависит от локали)
который, по-видимому, указывает на то, что существует временной интервал SOMETIMES, связанный с объектом locale().
Теперь, если вы возьмете локаль en_US.utf8 (один из моих фаворитов ;-)), на самом деле не существует разумного часового пояса для связи (Соединенные Штаты содержат не менее 4 или более часовых поясов).
Итак, время для эмпирического.
Я запустил код:
#include <iostream>
#include <cstdlib>
#include <locale>
#include <sstream>
using namespace std;
int main ()
{
// locale l;
locale l = locale::classic ();
tm when{};
const time_put<char>& tmput = use_facet<time_put<char>> (l);
ostringstream oss;
oss.imbue (l);
static const string kTZOffsetPattern_{"%z"};
tmput.put (oss, oss, ' ', &when, kTZOffsetPattern_.c_str (), kTZOffsetPattern_.c_str () + kTZOffsetPattern_.length ());
cout << oss.str ();
return 0;
}
В Linux (ubuntu) это дало ответ, который я ожидал, +0000 (ОК, я также не был бы удивлен ошибкой или пустой строкой).
Но в Windows (visual studio.net 2k17 - 15.8.7) - это дает: -0500
Да, как вы, возможно, догадались, я тестирую это в восточном часовом поясе. Но я все равно ожидал бы 0 или пустую строку (особенно для случая locale :: classic()).