Как определить текущее значение таймзоны?

Рейтинг: 1Ответов: 1Опубликовано: 24.01.2023

Есть функция GetDynamicTimeZoneInformation, с помощью которой хочу получить смещение текущего времени от UTC. Да, в структуре, которую она заполняет, есть поля Bias и DaylightBias, есть даже DaylightDate, в которой записано правило перехода на летнее время. Но неужели надо самому разбирать текущую дату и смотреть, сейчас летнее время или нет? Ведь 200% что Windows сама все это вычисляет.

Так как правильно получить текущее смещение от UTC для локальных настроек на компьютере, с учетом летнего времени? И без того чтоб писать свой код сравнения даты с правилом перехода?

Ответы

▲ 3

Ну, если надо вот прямо сейчас, то как вариант - сравнить время локальное и время UTC, только перевести в FILETIME. Ну, и сделать определенные телодвижения для выяснения знака. Может, можно и проще и надежнее, но в качестве первого приближения...

Значение в секундах. +10000 при пересчете (0.1ms) - чтоб точно убрать возможную разность между моментами определения локального и UTC времени. Может, и не требуется, но мало ли :)

int tzOffs() // In s
{
    SYSTEMTIME     st,  lt;
    FILETIME       sft, lft;
    ULARGE_INTEGER sli, lli;
    
    GetSystemTime(&st);
    GetLocalTime(&lt);

    SystemTimeToFileTime(&st,&sft);
    SystemTimeToFileTime(&lt,&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;
}