A fonte principal dos dados para conversão entre os identificadores de fuso horário do Windows e da IANA é o windowsZones.xmlarquivo, distribuído como parte do projeto Unicode CLDR . A versão mais recente do desenvolvedor pode ser encontrada aqui .
No entanto , o CLDR é lançado apenas duas vezes por ano. Isso, juntamente com a cadência periódica de atualizações do Windows e as atualizações irregulares do banco de dados de fuso horário da IANA, dificultam o uso direto dos dados CLDR. Lembre-se de que as mudanças de fuso horário são feitas por capricho dos vários governos do mundo e nem todas são feitas com aviso suficiente para entrar nesses ciclos de liberação antes de suas respectivas datas efetivas.
Existem alguns outros casos extremos que precisam ser tratados e não são cobertos estritamente pelo CLDR, e novos surgem de tempos em tempos. Portanto, encapsulei a complexidade da solução na micro-biblioteca TimeZoneConverter , que pode ser instalada no Nuget.
Usar esta biblioteca é simples. Aqui estão alguns exemplos de conversão:
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"
Existem mais exemplos no site do projeto .
É importante reconhecer que, embora um fuso horário da IANA possa ser mapeado para um único fuso horário do Windows, o inverso não é verdadeiro. Um único fuso horário do Windows pode ser mapeado para mais de um fuso horário da IANA. Isso pode ser visto nos exemplos acima, onde Eastern Standard Timeé mapeado para ambos America/New_Yorke para America/Toronto. O TimeZoneConverter fornecerá o que o CLDR marcar "001", conhecido como "zona de ouro", a menos que você forneça especificamente um código de país e haja uma correspondência para uma zona diferente nesse país.
Nota: Esta resposta evoluiu ao longo dos anos, portanto, os comentários abaixo podem ou não se aplicar à revisão atual. Revise o histórico de edições para obter detalhes. Obrigado.
(GMT+05:30) Chennai, Kolkata, Mumbai, New DelhidáAsia/Calcuttaque deveria serAsia/Kolkata. parece que oTzdbDateTimeZoneSourcecontém valores antigos.