2010-09-02 7 views
10

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

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

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

+0

Поскольку http://msdn.microsoft.com/en-us/library/ms725473%28v=VS.85%29.aspx не отображает его, я бы сказал, что его нет. Что плохого в чтении из реестра? –

+0

Это скорее боль, чем просто вызов функции, передаваемой строкой. Если это то, что я должен сделать, то это то, что я должен сделать, но я бы предпочел более простое решение. –

ответ

10

часовой пояс содержится в виде двоичных данных в реестре в 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; 
} 

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

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