Como: Resolver vezes ambíguos
Um horário ambíguo é um horário que aponta para mais de um Tempo Universal Coordenado (UTC). Ele ocorre quando a hora do relógio é atrasada, como durante a transição do horário de verão para o horário padrão de um fuso horário. Ao manipular um horário ambíguo, você pode fazer uma das seguintes opções:
Faça uma suposição sobre como o tempo aponta para o UTC. Por exemplo, você pode supor que um horário ambíguo é sempre expresso no horário padrão do fuso horário.
Se o horário ambíguo for um item de dados inserido pelo usuário, você pode deixar para o usuário resolver a ambiguidade.
Este tópico mostra como resolver um horário ambíguo, considerando-se que ele representa o horário padrão da zona de tempo.
Para mapear um horário ambíguo para um horário padrão de uma zona de tempo.
Chame o método IsAmbiguousTime para determinar se o horário é ambíguo.
Se o tempo for ambíguo, subtraia o horário do objeto TimeSpan retornado pela propriedade BaseUtcOffset da zona de tempo.
Chamar o static (Shared em Visual Basic.NET) SpecifyKind método para definir o UTC data e hora do valor Kind propriedade para DateTimeKind.Utc.
Exemplo
O exemplo a seguir ilustra como converter um horário ambíguo UTC presumindo-se que ele representa a hora padrão da zona de tempo do local.
Private Function ResolveAmbiguousTime(ambiguousTime As Date) As Date
' Time is not ambiguous
If Not TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime) Then
Return TimeZoneInfo.ConvertTimeToUtc(ambiguousTime)
' Time is ambiguous
Else
Dim utcTime As Date = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset, DateTimeKind.Utc)
Console.WriteLine("{0} local time corresponds to {1} {2}.", ambiguousTime, utcTime, utcTime.Kind.ToString())
Return utcTime
End If
End Function
private DateTime ResolveAmbiguousTime(DateTime ambiguousTime)
{
// Time is not ambiguous
if (! TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime))
{
return ambiguousTime;
}
// Time is ambiguous
else
{
DateTime utcTime = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset,
DateTimeKind.Utc);
Console.WriteLine("{0} local time corresponds to {1} {2}.",
ambiguousTime, utcTime, utcTime.Kind.ToString());
return utcTime;
}
}
O exemplo consiste de um método chamado ResolveAmbiguousTime que determina se o valor DateTime passado a ela é ambíguo. Se o valor for ambíguo, o método retorna um valor DateTime que representa o horário UTC correspondente. O método trata essa conversão subtraindo o valor da propriedade BaseUtcOffset da zona de tempo local do horário local.
Normalmente, um tempo ambíguo é tratado chamando-se o método GetAmbiguousTimeOffsets para recuperar uma matriz de objetos TimeSpan que contém os deslocamentos UTC possíveis ao horário ambíguo. No entanto, este exemplo faz a suposição arbitrária de que um horário ambíguo deve ser sempre mapeado para o horário padrão da zona de tempo. A propriedade BaseUtcOffset retorna a diferença entre o UTC e o horário padrão de uma zona de tempo.
Nesse exemplo, todas as referências para o fuso horário local são feitas através da propriedade TimeZoneInfo.Local; o fuso horário local nunca é atribuído a uma variável de objeto. Essa é uma prática recomendada pois uma chamada para o método TimeZoneInfo.ClearCachedData invalida quaisquer objetos aos quais o fuso horário local esteja atribuído.
Compilando o código
Este exemplo requer:
Que uma referência a System.Core.dll seja adicionada ao projeto.
Que o namespace System seja importado com a instrução using (necessária em código C#).
Consulte também
Tarefas
Como: Permitir que usuários resolver vezes ambíguo