O .Net DateTime contém informações sobre o fuso horário onde foi criado?
Eu tenho uma biblioteca que analisa DateTime de um formato que tem "+ zz" no final e, embora ela analise corretamente e ajuste a hora local, preciso saber qual era o fuso horário específico do objeto DateTime.
Isso é possível em tudo? Tudo o que posso ver é DateTime.Kind, que especifica se a hora é local ou UTC.
Respostas:
DateTime em si não contém informações de fuso horário real. Ele pode saber se é UTC ou local, mas não o que local realmente significa.
DateTimeOffset é um pouco melhor - basicamente uma hora UTC e um deslocamento. No entanto, isso ainda não é realmente o suficiente para determinar o fuso horário, já que muitos fusos horários diferentes podem ter o mesmo deslocamento em qualquer momento. No entanto, parece que pode ser bom o suficiente para você, já que tudo o que você precisa fazer ao analisar a data / hora é o deslocamento.
O suporte para fusos horários a partir do .NET 3.5 é muito melhor do que antes, mas eu realmente gostaria de ver um "ZonedDateTime" padrão ou algo parecido - um horário UTC e um fuso horário real. É fácil construir o seu próprio, mas seria bom vê-lo nas bibliotecas padrão.
EDIT: Quase quatro anos depois, eu agora sugiro usar o Noda Time, que tem um conjunto mais rico de tipos de data / hora. No entanto, sou tendencioso, como autor principal de Noda Time :)
fonte
Não.
Uma citação de um excelente artigo aqui . Uma leitura obrigatória para cada desenvolvedor .Net.
Portanto, meu conselho é escrever uma pequena aula de wrapper que atenda às suas necessidades.
fonte
Existe uma biblioteca TimeZone de domínio público para .NET . Muito útil. Ele atenderá às suas necessidades.
Resolver o problema geral de fuso horário é mais difícil do que você pensa.
fonte
Você pode usar a classe TimeZoneInfo
A classe TimeZone reconhece o fuso horário local e pode converter os horários entre o Tempo Universal Coordenado (UTC) e o horário local. Um objeto TimeZoneInfo pode representar qualquer fuso horário e os métodos da classe TimeZoneInfo podem ser usados para converter a hora em um fuso horário para a hora correspondente em qualquer outro fuso horário. Os membros da classe TimeZoneInfo suportam as seguintes operações:
Recuperando um fuso horário já definido pelo sistema operacional.
Enumerando os fusos horários disponíveis em um sistema.
Conversão de horários entre diferentes fusos horários.
Criar um novo fuso horário que ainda não foi definido pelo sistema operacional.
Serializando um fuso horário para recuperação posterior.
fonte
Na API ( http://msdn.microsoft.com/en-us/library/system.datetime_members(VS.71).aspx ), não parece que pode mostrar o nome do fuso horário usado.
fonte
Geralmente, a prática seria passar os dados como DateTime com um "fuso horário" do UTC e, em seguida, passar um objeto TimeZoneInfo e, quando estiver pronto para exibir os dados, use o objeto TimeZoneInfo para converter o DateTime UTC.
A outra opção é definir DateTime com o fuso horário atual e, em seguida, certificar-se de que o "fuso horário" é desconhecido para o objeto DateTime e, em seguida, certificar-se de que DateTime seja passado novamente com um TimeZoneInfo que indica o fuso horário do DateTime passado.
Como outros indicaram aqui, seria bom se a Microsoft resolvesse isso e criasse um objeto legal para fazer tudo, mas por enquanto você tem que lidar com dois objetos.
fonte
DateTime não sabe seu deslocamento de fuso horário. Não existe um método integrado para retornar o deslocamento ou o nome do fuso horário (por exemplo, EAT, CEST, EST etc).
Como sugerido por outros, você pode converter sua data para UTC:
e então apenas calcule a diferença:
Além disso, você pode converter uma hora para outra usando o DateTimeOffset:
Mas isso é um tipo de compactação com perdas - o deslocamento por si só não pode dizer qual fuso horário é, pois dois países diferentes podem estar em fusos horários diferentes e ter o mesmo tempo apenas durante parte do ano (por exemplo, África do Sul e Europa). Além disso, esteja ciente de que o horário de verão pode ser introduzido em datas diferentes (EST vs CET - uma diferença de 3 semanas).
Você pode obter o nome do fuso horário do sistema local usando a classe TimeZoneInfo:
Concordo com Gerrie Schenck, leia o artigo que ele sugeriu.
fonte