¿Cómo traducir entre las zonas horarias de Windows y IANA?

Como se describe en la wiki de etiqueta de zona horaria , hay dos estilos diferentes de zonas horarias.

Muchas API basadas en Internet utilizan las zonas horarias de IANA, pero, por numerosas razones, puede ser necesario convertirlas en una identificación de zona horaria de Windows o viceversa.

¿Cómo se puede lograr esto en .Net?

La fuente principal de los datos para la conversión entre Windows e identificadores de zona horaria de IANA es el archivo windowsZones.xml , distribuido como parte del proyecto Unicode CLDR .

Sin embargo , CLDR se lanza solo dos veces al año. Esto, junto con la cadencia periódica de las actualizaciones de Windows y las actualizaciones irregulares de la base de datos de la zona horaria de IANA, hace que sea complicado usar los datos de CLDR directamente. Tenga en cuenta que los cambios de zona horaria en sí mismos se realizan por capricho de los diversos gobiernos del mundo, y no todos los cambios se realizan con suficiente antelación para incluirlos en estos ciclos de publicación antes de sus respectivas fechas de vigencia.

Hay algunos otros casos de borde que necesitan ser tratados que no están cubiertos estrictamente por el CLDR, y los nuevos aparecen de vez en cuando. Por lo tanto, he encapsulado la complejidad de la solución en la micro biblioteca TimeZoneConverter, que se puede instalar desde Nuget.

Usar esta biblioteca es simple. Aquí hay algunos ejemplos de conversión:

 string tz = TZConvert.IanaToWindows("America/New_York"); // Result: "Eastern Standard Time" string tz = TZConvert.WindowsToIana("Eastern Standard Time"); // result: "America/New_York" string tz = TZConvert.WindowsToIana("Eastern Standard Time", "CA"); // result: "America/Toronto" 

Hay más ejemplos en el sitio del proyecto .

Es importante reconocer que, si bien una zona horaria de IANA se puede asignar a una única zona horaria de Windows, lo contrario no es cierto. Una sola zona horaria de Windows puede asignarse a más de una zona horaria de IANA. Esto se puede ver en los ejemplos anteriores, donde Eastern Standard Time se asigna a America/New_York y a America/Toronto . TimeZoneConverter entregará el que CLDR marca con "001" , conocida como la “zona dorada”, a menos que especifiques específicamente un código de país y coincida con una zona diferente en ese país.

Nota: Esta respuesta ha evolucionado a lo largo de los años, por lo que los comentarios a continuación pueden aplicarse o no a la revisión actual. Revisa el historial de edición para más detalles. Gracias.