Как определить текущее значение таймзоны?
Есть функция GetDynamicTimeZoneInformation, с помощью которой хочу получить смещение текущего времени от UTC. Да, в структуре, которую она заполняет, есть поля Bias и DaylightBias, есть даже DaylightDate, в которой записано правило перехода на летнее время. Но неужели надо самому разбирать текущую дату и смотреть, сейчас летнее время или нет? Ведь 200% что Windows сама все это вычисляет.
Так как правильно получить текущее смещение от UTC для локальных настроек на компьютере, с учетом летнего времени? И без того чтоб писать свой код сравнения даты с правилом перехода?
Ответы (1 шт):
Ну, если надо вот прямо сейчас, то как вариант - сравнить время локальное и время UTC, только перевести в FILETIME. Ну, и сделать определенные телодвижения для выяснения знака. Может, можно и проще и надежнее, но в качестве первого приближения...
Значение в секундах. +10000 при пересчете (0.1ms) - чтоб точно убрать возможную разность между моментами определения локального и UTC времени. Может, и не требуется, но мало ли :)
int tzOffs() // In s
{
SYSTEMTIME st, lt;
FILETIME sft, lft;
ULARGE_INTEGER sli, lli;
GetSystemTime(&st);
GetLocalTime(<);
SystemTimeToFileTime(&st,&sft);
SystemTimeToFileTime(<,&lft);
sli.LowPart = sft.dwLowDateTime;
sli.HighPart = sft.dwHighDateTime;
lli.LowPart = lft.dwLowDateTime;
lli.HighPart = lft.dwHighDateTime;
int offs = (lli.QuadPart > sli.QuadPart) ?
(lli.QuadPart - sli.QuadPart + 10000)/10000000 :
(sli.QuadPart - lli.QuadPart + 10000)/10000000;
if (lli.QuadPart < sli.QuadPart) offs = -offs;
return offs;
}