La fuente principal de los datos para la conversión entre Windows y los identificadores de zona horaria de IANA es el windowsZones.xml
archivo, distribuido como parte del proyecto Unicode CLDR . La última versión de desarrollo se puede encontrar aquí .
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 zonas horarias de la IANA, hace que sea complicado usar los datos CLDR directamente. Tenga en cuenta que los cambios de zona horaria se realizan a voluntad de los distintos gobiernos del mundo, y no todos los cambios se realizan con suficiente antelación para que entren en estos ciclos de lanzamiento antes de sus respectivas fechas de vigencia.
Hay algunos otros casos extremos que deben manejarse que no están cubiertos estrictamente por el CLDR, y de vez en cuando aparecen nuevos. Por lo tanto, he encapsulado la complejidad de la solución en el TimeZoneConverter micro-biblioteca, 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 podría 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 ambos America/New_York
y a America/Toronto
. TimeZoneConverter entregará el que marca CLDR "001"
, conocido como la "zona dorada", a menos que proporcione específicamente un código de país y haya una coincidencia para 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 o no aplicarse a la revisión actual. Revise el historial de edición para más detalles. Gracias.
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
daAsia/Calcutta
que debería serAsia/Kolkata
. Parece queTzdbDateTimeZoneSource
contiene valores antiguos.