Получение часового пояса в Windows с помощью C++

Я хочу синхронизировать часы Windows и Linux. Windows получает свои системные часы (с функцией GetSystemTimeAsFileTime) и отправляет их в Linux. Затем Linux устанавливает свои часы соответственно (с функцией settimeofday).

Мне также нужно передать часовой пояс Windows и преобразовать его в стандарт Linux. Как я могу получить часовой пояс Windows на C++?

наилучшие пожелания, Мустафа!--1-->

4 ответов


GetTimeZoneInformation вероятно, это то, что вы ищете.


даже если вы не синхронизируетесь со стандартным временем, но со временем между машинами, вы должны использовать NTP.

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

просто настройте сервер NTP на машина, которую вы хотите как Мастер, и настройте клиент NTP на другой машине, запросив мастер. Просто и безболезненно.

прошло некоторое время с тех пор, как я настроил серверы NTP; я предполагаю, что вы можете использовать утилиты NTP, которые поставляются стандартными с операционными системами, чтобы выполнить работу с минимальной конфигурацией, если у вас есть права администратора на полях.


GetDynamicTimeZoneInformation является более полезной функцией. он также дает ключ реестра для часового пояса..

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs. 85).aspx


GetDynamicTimeZoneInformation не всегда работает. Минимальные поддерживаемые версии-Windows Vista, Windows Server 2008 и Windows Phone 8. Так что для чего-нибудь ниже этого GetTimeZoneInformation лучше.

однако другая проблема-оба иногда возвращаются StandardName или DaylightName пустой. В этом случае вы должны использовать реестр Windows. Вот функция, взятая из gnu cash, которая также была изменена из glib.

static std::string
windows_default_tzname(void)
{
    const char *subkey =
        "SYSTEM\CurrentControlSet\Control\TimeZoneInformation";
    constexpr size_t keysize{128};
    HKEY key;
    char key_name[keysize]{};
    unsigned long tz_keysize = keysize;
    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0,
                      KEY_QUERY_VALUE, &key) == ERROR_SUCCESS)
    {
        if (RegQueryValueExA(key, "TimeZoneKeyName", nullptr, nullptr,
                             (LPBYTE)key_name, &tz_keysize) != ERROR_SUCCESS)
        {
            memset(key_name, 0, tz_keysize);
        }
        RegCloseKey(key);
    }
    return std::string(key_name);
}