Cómo obtener una cadena de zona horaria con formato POSIX en C++
Recientemente, obtuvimos el requisito de obtener la zona horaria actual del sistema y enviarla como una cadena con formato POSIX (PST8PDT, M3.2.0/2, M11.1.0/2).
Estamos en entorno Windows y usamos lenguaje C++.
TIME_ZONE_INFORMATION tzInfo; GetTimeZoneInformation(&tzInfo);
Al usar el código anterior, obtuvimos la información de la zona horaria actual y tiene un nombre estándar y un nombre de luz diurna (brinda una descripción completa, no un nombre abreviado), sesgo UTC (minutos).
Pero, ¿cómo obtener la cadena de zona horaria formateada en POSIX?
Cadena con formato POSIX = DST abreviado fuera de la zona horaria + desplazamiento UTC + DST abreviado en la zona horaria + regla para el cambio de DST
Revisamos las bibliotecas crono y POCO y no pudimos encontrar ninguna API que realice esta conversión.
La razón por la que necesitamos esta conversión es que nos estamos comunicando con un dispositivo de queja ONVIF donde tenemos que configurar la hora actual del sistema y la zona horaria del dispositivo.
Por lo tanto, estamos llamando a la API SetSystemDateAndTime (consulte el archivo wsdl a continuación) que necesita esta información de zona horaria https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
Por favor comparte tus aportes
En general, esto no será posible. Algunas zonas horarias no son lo suficientemente regulares con respecto al calendario gregoriano como para que una zona horaria POSIX represente más de un año.
Por ejemplo, "Asia/Gaza" se basa en el calendario islámico. La zona horaria POSIX "EET-2EEST,M3.5.6,M10.5.6" la representará solo entre 2023 y 2026. Y "EET-2EEST,M3.5.0/0,M10.5.6" funcionó para esta zona horaria solo durante 2022.
Otro problema es que algunas zonas horarias están en "DST permanente" y no hay forma de representar esto en zonas horarias POSIX (sin una extensión de la sintaxis POSIX).
Por último, casi ninguna zona horaria puede representarse mediante una única zona horaria POSIX a lo largo de décadas.
Por ejemplo, la zona horaria POSIX a la que hace referencia puede representar "América/Los_Angeles", pero solo desde el 11 de marzo de 2007 (los últimos 17 años). Antes de eso era "PST8PDT,M4.1.0,M10.5.0" (en comparación con "PST8PDT,M3.2.0,M11.1.0").
Lo mejor que puede hacer es transmitir una cadena de zona horaria POSIX que representará este año, pero posiblemente no el año pasado ni el próximo. E incluso eso será una aproximación para aquellas zonas horarias con horario de verano permanente.
Debido a estas complicaciones y compromisos, que yo sepa, no existe tal conversión. Intenté crear una utilidad de este tipo y me di por vencido después de encontrarme con estos obstáculos para encontrar una solución completamente precisa.
Lo mejor que puede hacer es refinar sus requisitos a un número limitado de zonas horarias durante un rango de tiempo limitado y crear el mapa manualmente.