Existe alguma maneira de converter um fuso horário da “Austrália/Melbourne” em algum objeto de biblioteca da classe base .NET?
Pergunta
Eu tenho alguns dados de uma terceira parte que inclui alguns string Language
dados da propriedade. Alguns dados de amostra recuperados se parecem:
"Austrália/Melbourne"
Quando investigei que o que o tipo de dados da propriedade se baseava, é um Informações da zona (banco de dados TZ / banco de dados OLSON). WTF é isso? Eu pesquisei e aqui está a informação ....
Parece que é usado por muitas plataformas principais ... mas não .NET.
Então, antes de reinventar a roda (ou, mais direto, atualizar o código desse site CodePlex para incorporar a lista de banco de dados na DLL), isso já existe na biblioteca da classe base .NET?
Solução
É uma info da zona (banco de dados TZ / banco de dados OLSON). WTF é isso?
É o portátil, praticamente padrão maneira de representar fusos horários. É uma pena que o .NET não o apoie corretamente, IMO.
Você está usando .NET 3.5? Se sim, o TimeZoneInfo
A classe é o melhor suporte que temos, mas converter do nome Olson para o nome do Windows pode ser complicado. Idealmente, você deseja uma conversão do Olson ID para o ID que o Windows usa ... Não sei se há uma disponível.
EDIT: Após um pouco de escavação, alguns links:
- o Projeto Chronos tem arquivos de mapeamento entre IDs Win32 e IDs Olson (Html, Texto)
- O site Unicode tem um arquivo de mapeamento semelhante
Não sei com que frequência eles são mantidos atualizados, mas podem muito bem ser sua melhor aposta.
Outras dicas
Há uma ótima biblioteca .NET no projeto de código que faz exatamente o que você precisa:
http://www.codeproject.com/kb/locale/zoneinfo_dotnet_api.aspx
Eu uso isso em vários projetos que conversam com as APIs do Google, pois todos os seus fusos horários estão no formato de banco de dados ZoneInfo/Olsen.
Eu também escrevi uma postagem no blog sobre como configurá -lo: http://www.diaryofaninja.com/blog/2011/05/27/how-to-use-zoneinfotz-time-zones-in-net-applications
convertê -lo para GMT? Procure as horas +x hrs ou -x e subtraia o deslocamento da data/hora que você armazenou. por exemplo. No seu exemplo, subtraia 10, pois Melbourne é +10 GMT ??