Estou tentando criar um teste de unidade para testar o caso de quando o fuso horário muda em uma máquina porque foi definido incorretamente e depois corrigido.
No teste, preciso criar objetos DateTime em um fuso horário local nenhum para garantir que as pessoas que executam o teste possam fazê-lo com êxito, independentemente de onde estejam localizadas.
Pelo que posso ver no construtor DateTime, posso definir o Fuso Horário como o fuso horário local, o fuso horário UTC ou não especificado.
Como crio um DateTime com um fuso horário específico como o PST?
Respostas:
A resposta de Jon fala sobre o TimeZone , mas eu sugiro usar o TimeZoneInfo .
Pessoalmente, gosto de manter as coisas no UTC sempre que possível (pelo menos no passado; armazenar o UTC para o futuro tem possíveis problemas ), então sugiro uma estrutura como esta:
Você pode alterar os nomes "TimeZone" para "TimeZoneInfo" para tornar as coisas mais claras - prefiro os nomes mais breves.
fonte
A estrutura DateTimeOffset foi criada para exatamente esse tipo de uso.
Vejo: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Aqui está um exemplo de criação de um objeto DateTimeOffset com um fuso horário específico:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
fonte
As outras respostas aqui são úteis, mas não abordam como acessar o Pacífico especificamente - aqui está:
Curiosamente, embora "Horário padrão do Pacífico" normalmente signifique algo diferente de "Horário de verão do Pacífico", neste caso, refere-se ao horário do Pacífico em geral. De fato, se você
FindSystemTimeZoneById
buscá-lo, uma das propriedades disponíveis é um booleano informando se esse fuso horário está atualmente no horário de verão ou não.Você pode ver exemplos mais generalizados disso em uma biblioteca que acabei lançando para lidar com o DateTimes de que preciso em diferentes fusos horários, com base no local de solicitação do usuário, etc:
https://github.com/b9chris/TimeZoneInfoLib.Net
Isso não funcionará fora do Windows (por exemplo, Mono no Linux), pois a lista de horários vem do Registro do Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
Abaixo, você encontrará chaves (ícones de pastas no Editor do Registro); os nomes dessas chaves são para os quais você passa
FindSystemTimeZoneById
. No Linux, você precisa usar um conjunto separado de definições de fuso horário, padrão do Linux, que não explorei adequadamente.fonte
Eu alterei Jon Skeet responder a um pouco para a web com método de extensão. Também funciona no azul como um encanto.
fonte
Você precisará criar um objeto personalizado para isso. Seu objeto personalizado conterá dois valores:
Não tenho certeza se já existe um tipo de dados fornecido pelo CLR, mas pelo menos o componente TimeZone já está disponível.
fonte
Gosto da resposta de Jon Skeet, mas gostaria de acrescentar uma coisa. Não tenho certeza se Jon esperava que o ctor sempre fosse passado no fuso horário local. Mas eu quero usá-lo para casos em que é algo diferente de local.
Estou lendo valores de um banco de dados e sei em que fuso horário esse banco de dados está. Portanto, no ctor, passo o fuso horário do banco de dados. Mas então eu gostaria do valor na hora local. O LocalTime de Jon não retorna a data original convertida em uma data de fuso horário local. Ele retorna a data convertida no fuso horário original (o que você tiver passado para o ctor).
Acho que esses nomes de propriedades esclarecem ...
fonte
O uso da classe TimeZones facilita a criação de uma data específica para o fuso horário.
fonte