Как вы получаете информацию для произвольного часового пояса в Windows? - PullRequest
10 голосов
/ 02 сентября 2010

В идеале, я хотел бы иметь возможность взять имя часового пояса и запросить у Windows информацию о соответствующем часовом поясе (смещение по UTC, смещение летнего времени, даты переключения DST и т. Д.). Похоже, что Windows использует TIME_ZONE_INFORMATION структуру для хранения такого рода информации. Итак, предположительно, я хочу функцию, которая принимает строку с именем часового пояса и возвращает структуру TIME_ZONE_INFORMATION.

Однако все, что я могу найти, это такие функции, как GetTimeZoneInformation () , которые дают мне TIME_ZONE_INFORMATION для местного времени. Что мне нужно, так это функция, которая даст мне эту информацию для произвольного часового пояса независимо от того, какой местный часовой пояс.

Единственный способ получить эту информацию, которую я вижу, - это получить ее непосредственно из реестра, что далеко не идеально. Страница TIME_ZONE_INFORMATION показывает, где она находится в реестре, поэтому должна быть возможность получить информацию оттуда, но я бы предпочел для нее подходящую системную функцию. Существует ли такая функция, или мне нужно заняться регистрацией, чтобы получить информацию о часовом поясе для произвольного часового пояса?

Ответы [ 2 ]

10 голосов
/ 27 октября 2010

Информация о часовом поясе содержится в виде двоичных данных в реестре под HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\(zone name)\TZI.Структура данных приведена в документации TIME_ZONE_INFORMATION:

struct STimeZoneFromRegistry
{
 long  Bias;
 long  StandardBias;
 long  DaylightBias;
 SYSTEMTIME StandardDate;
 SYSTEMTIME DaylightDate;
};

А вот пример кода для чтения ключа:

TIME_ZONE_INFORMATION tz = {0};
STimeZoneFromRegistry binary_data;
DWORD size = sizeof(binary_data);
HKEY hk = NULL;
TCHAR zone_key[] = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\Central Standard Time");
if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, zone_key, 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS) &&
 (RegQueryValueEx(hk, "TZI", NULL, NULL, (BYTE *) &binary_data, &size) == ERROR_SUCCESS))
{
 tz.Bias = binary_data.Bias;
 tz.DaylightBias = binary_data.DaylightBias;
 tz.DaylightDate = binary_data.DaylightDate;
 tz.StandardBias = binary_data.StandardBias;
 tz.StandardDate = binary_data.StandardDate;
}

Редактировать: Извините, этоответ излишен - я уверен, что вы могли бы все это выяснить, используя документацию, на которую вы ссылались в вопросе.Я должен был сделать это только один раз, и это единственный метод, который я смог найти.

2 голосов
/ 27 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...