2011-08-15 14 views
6

Chcę synchronizować zegary Windows i Linux. Windows otrzymuje swój zegar systemowy (z funkcją GetSystemTimeAsFileTime) i wysyła go do systemu Linux. Następnie Linux ustawia odpowiednio swój zegar (z funkcją settimeofday).Uzyskiwanie strefy czasowej w systemie Windows za pomocą C++

Muszę również przesłać strefę czasową systemu Windows i przekonwertować ją na standard Linux. Jak mogę uzyskać strefę czasową systemu Windows w C++?

najlepsze życzenia, Mustafa

+0

Czego już próbowałeś? Czy napotkali Państwo jakiekolwiek problemy z próbami? –

+1

Kiedy mówisz "standard linuxowy", masz na myśli UTC? Czy używasz swojego komputera z systemem Linux z zegarem UTC? Czy [GetSystemTimeAsFileTime] (http://msdn.microsoft.com/en-us/library/ms724397.aspx) nie zwraca czasu UTC? Czy nie byłoby lepiej zsynchronizować zarówno z trzecim serwerem NTP, czy uruchomić serwer NTP na jednym z pól i użyć tego? Oba systemy mają klientów NTP dostępnych/wbudowanych. – Rup

+0

NTP byłby najlepszym wyborem w wielu przypadkach. Ale w tym przypadku muszę zsynchronizować je ze sobą, a nie z czasem rzeczywistym. – mustafa

Odpowiedz

9

GetTimeZoneInformation jest chyba to, czego szukasz.

+1

dzięki, tak, jest. zwraca strukturę TIME_ZONE_INFORMATION, która zawiera zarówno wartość Bias (jako długość całkowitą w minutach), jak i nazwę strefy. Ponieważ nazwy stref w Linuksie są różne, myślę, że lepiej jest użyć Bias, aby ustawić strefę czasową Linuksa. Jednak nie mogłem znaleźć sposobu na ustawienie strefy czasowej Linuksa za pomocą Bias. eksportowanie TZ z GMT + x nie działa na moim Ubuntu, – mustafa

3

Nawet jeśli nie jesteś synchronizacja do standardowego czasu, ale do czasu pomiędzy maszynami, należy użyć NTP.

NTP to dojrzały, solidny protokół, który rozwiązał cały zestaw problemów, które napotkasz lub odkrył: odkrywanie, transport komunikacyjny, opóźnienia i fluktuacje, różnice w strefach czasowych, zarządzanie dryfem, więc nie musisz mylić inne procesy współużytkujące te same maszyny, właściwie ustawiając czas, uprawnienia itp.

Wystarczy skonfigurować serwer NTP na komputerze, który ma być serwerem głównym, i skonfigurować klienta NTP na drugim komputerze , zapytanie do mistrza. Prosty i bezbolesny.

Minęło trochę czasu, odkąd skonfigurowałem serwery NTP; Zakładam, że możesz używać narzędzi NTP, które są standardem dla systemów operacyjnych, aby wykonać zadanie przy minimalnej konfiguracji, o ile masz uprawnienia administratora w skrzynkach.

0

GetDynamicTimeZoneInformation nie zawsze działa. Minimalna obsługiwana wersja to Windows Vista, Windows Server 2008 i Windows Phone 8. Tak więc wszystko poniżej GetTimeZoneInformation jest lepsze.

Innym problemem jest czasami powrót: StandardName lub DaylightName pusty. W takim przypadku musisz użyć rejestru systemu Windows. Oto funkcja zaczerpnięta z gotówki gnu, która również została zmodyfikowana z 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); 
} 
Powiązane problemy