Partilhar via


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.

  1. Chame o método IsAmbiguousTime para determinar se o horário é ambíguo.

  2. Se o tempo for ambíguo, subtraia o horário do objeto TimeSpan retornado pela propriedade BaseUtcOffset da zona de tempo.

  3. 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

Outros recursos

Datas, horas e fusos horários