Obtenga las fechas de transición del horario de verano para las zonas horarias en C

En C, ¿existe una forma sencilla y multiplataforma de recuperar las fechas en que una determinada zona horaria comienza y termina en horario de verano?

Ya tengo información de compensación de la zona horaria y si se está observando el horario de verano o no, pero realmente necesito las fechas en las que comienza y termina el horario de verano (para una dependencia externa que no controlo). En Windows, estoy usando GetTimeZoneInformation para obtener TimeZoneInfo , pero no puedo encontrar una función similar para Linux / Solaris / Mac. También debo señalar que no puedo simplemente confiar en las reglas de los EE. UU. Para la adopción del horario de verano, ya que no puedo predecir en qué países se utilizarán.

La única forma que conozco para obtener esta información es a través de zdump o tal vez mirando directamente los archivos / usr / share / lib / zoneinfo, pero esperaba una mejor solución.

Gracias por cualquier ayuda que usted nos pueda proporcionar.

La manera portátil y consistente de lidiar con esto es construir una tabla de compensación TZ durante todo el año (para cada día en el año actual en la zona horaria actual) al inicio de la aplicación. Resuelva la hora local de medianoche de cada día a UTC (GMT) y registre la diferencia de zona horaria efectiva con respecto a UTC (GMT) para el día en cuestión. Busque las transiciones en las compensaciones de TZ efectivas durante todo el año (las transiciones indicarán cambios de horario de verano). Este enfoque es coherente y portátil, ya que solo depende de que la gmtime en cuestión funcione de manera confiable en la plataforma en cuestión y proporcionará resultados totalmente compatibles con la localtime . gmtime llamadas. Sin embargo, se vuelve un poco más complicado si necesita información de horario de verano para otras zonas horarias (que la zona horaria predeterminada del proceso).

También puede usar directamente la base de datos TZ / Olson (código disponible para * nix y Windows), para obtener la máxima flexibilidad , pero a menos que el tiempo de ejecución / SO subyacente use la misma información de la zona horaria (y su aplicación utiliza la información de la zona horaria TZ / Olson y gmtime / localtime indistintamente) entonces te esperan sorpresas desagradables.

No estoy seguro de que haya una buena forma multiplataforma para hacer esto, pero hay una interfaz programática para los archivos /usr/share/zoneinfo (o al menos una descripción del formato) en tzfile.h , (disponible en Mac OS X y Linux).

Windows usa asignaciones ligeramente diferentes de tzinfo, pero hay una tabla de conversión que puede usar para generar su interfaz entre Windows y Unix.

En C, ¿existe una forma sencilla y multiplataforma de recuperar las fechas en que una zona horaria determinada comienza y termina en horario de verano?

No.

Implementé el soporte TZ en VMS para DEC a finales de los 90.

En primer lugar, no hay una solución multiplataforma.

En segundo lugar, las fechas varían de un año a otro y también por orden legislativa. De hecho, no existe una solución programática totalmente confiable.

Si necesita C ++ (no C) busque boost :: date_time library http://www.boost.org/doc/libs/1_38_0/doc/html/date_time.html