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
Chame o IsAmbiguousTime método para determinar se o tempo é ambíguo.
Se a hora for ambígua, subtraia a hora do TimeSpan objeto retornado pela propriedade do BaseUtcOffset fuso horário.
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.