C++

2011-08-15 11 views
6

ile Windows'ta saat dilimi alma Windows ve Linux saatlerini senkronize etmek istiyorum. Windows sistem saatini (GetSystemTimeAsFileTime işleviyle) alır ve Linux'a gönderir. Daha sonra, Linux saatini buna göre ayarlar (buradaki ayar fonksiyonu ile).C++

Ayrıca, Windows saat dilimini aktarmalı ve Linux standardına dönüştürmem gerekir. C++'da Windows saat dilimini nasıl alabilirim?

iyi dilek, Mustafa

+0

Zaten ne denediniz? Denemelerinizle ilgili herhangi bir sorunla karşılaştınız mı? –

+1

'Linux standart' derken UTC'yi mi kastediyorsunuz? Linux makinenizi UTC saati ile mi çalıştırıyorsunuz? [GetSystemTimeAsFileTime] (http://msdn.microsoft.com/en-us/library/ms724397.aspx) UTC döndürmez mi? Her ikisini de bir NTP sunucusuna eşitlemek veya kutulardan birinde bir NTP sunucusu çalıştırmak daha iyi olmaz mı? Her iki işletim sistemi de mevcut/yerleşik NTP istemcilerine sahiptir. Birçok durumda en iyi seçenek – Rup

+0

NTP olacaktır. Ama bu durumda, onları gerçek zamana değil, birbirinize senkronize etmem gerekiyor. – mustafa

cevap

9

GetTimeZoneInformation Eğer aradığınızı olasılıkla gerçek değildir.

+1

teşekkürler, evet, öyle. hem Bias'ı (dakika cinsinden uzun tam sayı olarak) hem de bölgenin adını içeren TIME_ZONE_INFORMATION yapısını döndürür. Linux bölgelerinin isimleri farklı olduğundan, Linux saat dilimini ayarlamak için Bias'ı kullanmanın daha iyi olduğunu düşünüyorum. Ancak, Bias'ı kullanarak Linux saat dilimini ayarlamanın bir yolunu bulamadım. GMT + x ile TZ'yi ihraç etmek Ubuntu'mda çalışmıyor, – mustafa

3

da diliminin için kayıt defteri anahtarını verir ama makineler arasındaki zaman, sen NTP kullanmalıdır.

NTP, bulacağınız ya da zaten bulduğunuz tüm sorunları çözen olgun, sağlam bir protokoldür: keşif, iletişim aktarımı, gecikme ve titreşim, saat dilimi farklılıkları, sürüklenmeyi yönetme aynı makineyi paylaşan diğer işlemleri karıştırın, aslında zamanı doğru olarak ayarlayın, izinler, vb.

Ana makine olarak istediğiniz makinede bir NTP sunucusu kurun ve diğer makinede NTP istemcisini kurun master'ı sorgulamak. Basit ve ağrısız.

NTP sunucularını kurduğumdan beri bir süre geçti; Kutularda yönetici ayrıcalıklarına sahip olduğunuz sürece, işi en düşük yapılandırma ile yapmak için işletim sistemlerinde standart olarak gelen NTP yardımcı programlarını kullanabileceğinizi varsayalım.

0

GetDynamicTimeZoneInformation her zaman çalışmıyor. Desteklenen minimum sürümler Windows Vista, Windows Server 2008 ve Windows Phone 8'dir. Bu nedenle, GetTimeZoneInformation'un altındaki her şey daha iyidir. Bununla birlikte, başka bir sorun bazen StandardName veya DaylightName boştur. Bu durumda windows kayıt defterini kullanmanız gerekir. Burada glib'den de değiştirilen gnu nakitten alınan fonksiyon.

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); 
}