Получение часового пояса в Windows с C ++ - PullRequest
6 голосов
/ 15 августа 2011

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

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

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

Ответы [ 4 ]

9 голосов
/ 15 августа 2011

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

3 голосов
/ 12 марта 2014

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

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

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

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

1 голос
/ 23 октября 2013

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

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

0 голосов
/ 07 сентября 2017

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...