Partilhar via


Como: Resolver tempos ambíguos

Um tempo ambíguo é um tempo que mapeia para mais de um Tempo Universal Coordenado (UTC). Ocorre quando a hora do relógio é ajustada de volta no tempo, como durante a transição do horário de verão de um fuso horário de verão para seu horário padrão. Ao lidar com um tempo ambíguo, você pode seguir um destes procedimentos:

  • Faça uma suposição sobre como o tempo é mapeado para UTC. Por exemplo, você pode supor que uma hora ambígua é sempre expressa na hora padrão do fuso horário.

  • Se o tempo ambíguo for um item de dados inseridos pelo usuário, você pode deixar para o usuário resolver a ambiguidade.

Este tópico mostra como resolver uma hora ambígua assumindo que ela representa a hora padrão do fuso horário.

Para mapear uma hora ambígua para a hora padrão de um fuso horário

  1. Chame o IsAmbiguousTime método para determinar se o tempo é ambíguo.

  2. Se a hora for ambígua, subtraia a hora do TimeSpan objeto retornado pela propriedade do BaseUtcOffset fuso horário.

  3. Chame o static método (Shared no Visual Basic .NET) SpecifyKind para definir a propriedade do valor de data e hora UTC Kind como DateTimeKind.Utc.

Exemplo

O exemplo a seguir ilustra como converter uma hora ambígua em UTC assumindo que ela representa a hora padrão do fuso horário local.

private static 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;
    }
}
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

O exemplo consiste em um método chamado ResolveAmbiguousTime que determina se o valor passado para ele é ambíguo DateTime . Se o valor for ambíguo, o método retornará um DateTime valor que representa a hora UTC correspondente. O método manipula essa conversão subtraindo o valor da propriedade do fuso BaseUtcOffset horário local da hora local.

Normalmente, um tempo ambíguo é tratado chamando o GetAmbiguousTimeOffsets método para recuperar uma matriz de TimeSpan objetos que contêm os possíveis deslocamentos UTC do tempo ambíguo. No entanto, este exemplo faz a suposição arbitrária de que uma hora ambígua deve sempre ser mapeada para a hora padrão do fuso horário. A BaseUtcOffset propriedade retorna o deslocamento entre UTC e a hora padrão de um fuso horário.

Neste exemplo, todas as referências ao fuso horário local são feitas através da TimeZoneInfo.Local propriedade, o fuso horário local nunca é atribuído a uma variável de objeto. Essa é uma prática recomendada porque uma chamada para o método invalida todos os TimeZoneInfo.ClearCachedData objetos aos quais o fuso horário local está atribuído.

Consulte também