2011-08-15 12 views
6

Quiero sincronizar relojes de Windows y Linux. Windows obtiene su reloj de sistema (con la función GetSystemTimeAsFileTime) y lo envía a Linux. Entonces, Linux establece su reloj en consecuencia (con la función settimeofday).Obteniendo la zona horaria en Windows con C++

También necesito transmitir el huso horario de Windows y convertirlo a Linux. ¿Cómo puedo obtener la zona horaria de Windows en C++?

mejores deseos, Mustafa

+0

¿Qué es lo que ya ha intentado? ¿Encontraste algún problema con tus intentos? –

+1

Cuando dices 'linux standard' te refieres a UTC? ¿Estás ejecutando tu máquina Linux con un reloj UTC? ¿[GetSystemTimeAsFileTime] (http://msdn.microsoft.com/en-us/library/ms724397.aspx) no devuelve UTC? ¿No sería mejor sincronizar ambos en un tercer servidor NTP o ejecutar un servidor NTP en uno de los cuadros y usar eso? Ambos sistemas operativos tienen clientes NTP disponibles/integrados. – Rup

+0

NTP sería la mejor opción en muchos casos. Pero en este caso, necesito sincronizarlos el uno al otro, no al tiempo real. – mustafa

Respuesta

9

GetTimeZoneInformation es probablemente lo que usted está buscando.

+1

gracias, sí, lo es. devuelve la estructura TIME_ZONE_INFORMATION que incluye tanto Bias (como entero largo en minutos) como el nombre de la zona. Como los nombres de las zonas en Linux son diferentes, creo que es mejor usar Bias para establecer la zona horaria de Linux. Sin embargo, no pude encontrar una manera de establecer la zona horaria Linux utilizando Bias. exportar TZ con GMT + x no funciona en mi Ubuntu, – mustafa

3

Incluso si usted no está sincronizando a la hora estándar, pero en cuando entre las máquinas, se debe utilizar NTP.

NTP es un protocolo maduro y robusto que ha resuelto toda la pila de problemas que va a encontrar, o que ya ha encontrado: descubrimiento, transporte de comunicaciones, latencia y fluctuación, diferencias de zona horaria, administración de deriva para que no confundir otros procesos que comparten la (s) misma (s) máquina (s), configurando la hora correctamente, permisos, etc.

Simplemente configure un servidor NTP en la máquina que desea como maestro y configure el cliente NTP en la otra máquina , preguntando al maestro. Simple e indoloro.

Ha pasado un tiempo desde que configuré servidores NTP; Supongo que puede usar las utilidades NTP que vienen de forma estándar con los sistemas operativos para hacer el trabajo con la configuración mínima, siempre que tenga privilegios de administrador en los cuadros.

0

GetDynamicTimeZoneInformation no siempre funciona. Las versiones mínimas admitidas son Windows Vista, Windows Server 2008 y Windows Phone 8. Por lo tanto, para cualquier valor por debajo de GetTimeZoneInformation es mejor.

Sin embargo, otro problema es a veces devolver StandardName o DaylightName vacío. En ese caso, debe usar el registro de Windows. Aquí está la función tomada de gnu efectivo que también fue modificado de 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); 
} 
Cuestiones relacionadas