Получение часового пояса в Windows с помощью C++
Я хочу синхронизировать часы Windows и Linux. Windows получает свои системные часы (с функцией GetSystemTimeAsFileTime) и отправляет их в Linux. Затем Linux устанавливает свои часы соответственно (с функцией settimeofday).
Мне также нужно передать часовой пояс Windows и преобразовать его в стандарт Linux. Как я могу получить часовой пояс Windows на C++?
наилучшие пожелания, Мустафа!--1-->
4 ответов
даже если вы не синхронизируетесь со стандартным временем, но со временем между машинами, вы должны использовать 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);
}