A fonte principal dos dados para conversão entre os identificadores de fuso horário do Windows e da IANA é o windowsZones.xml
arquivo, 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_York
e 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 Delhi
dáAsia/Calcutta
que deveria serAsia/Kolkata
. parece que oTzdbDateTimeZoneSource
contém valores antigos.