Procedimiento para resolver horas ambiguas

Una hora ambigua es aquella que se asigna a más de una hora universal coordinada (UTC). Esto sucede cuando la hora del reloj se atrasa, como durante la transición del horario de verano de una zona horaria al horario estándar. Cuando se enfrente a una hora ambigua, puede realizar una de las siguientes acciones:

  • Piense cómo se corresponde esa hora con la hora UTC. Por ejemplo, puede dar por supuesto que una hora ambigua siempre se expresa en la hora estándar de la zona horaria.

  • Si la hora ambigua es un dato introducido por el usuario, puede dejar que el usuario resuelva la ambigüedad.

Este tema muestra cómo resolver una hora ambigua dando por supuesto que representa la hora estándar de la zona horaria.

Para asignar una hora ambigua a la hora estándar de una zona horaria

  1. Llame al método IsAmbiguousTime para determinar si la hora es ambigua.

  2. Si la hora es ambigua, reste la hora al objeto TimeSpan devuelto por la propiedad BaseUtcOffset de la zona horaria.

  3. Llame al método SpecifyKindstatic (Shared en .NET de Visual Basic) para establecer la propiedad Kind del valor de fecha y hora UTC en DateTimeKind.Utc.

Ejemplo

En el ejemplo siguiente se muestra cómo convertir una hora ambigua a UTC dando por supuesto que representa la hora estándar de la zona horaria 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

El ejemplo consta de un método denominado ResolveAmbiguousTime que determina si el valor DateTime pasado es ambiguo. Si el valor es ambiguo, el método devuelve un valor DateTime que representa la hora UTC correspondiente. El método trata esta conversión restando a la hora local el valor de la propiedad BaseUtcOffset de la zona horaria local.

Normalmente, una hora ambigua se controla mediante una llamada al método GetAmbiguousTimeOffsets para recuperar una matriz de objetos TimeSpan que contienen los desplazamientos posibles de la hora ambigua desde la hora UTC. Pero en este ejemplo se supone arbitrariamente que una hora ambigua siempre debe estar asignada a la hora estándar de la zona horaria. La propiedad BaseUtcOffset devuelve la diferencia entre la hora UTC y la hora estándar de una zona horaria.

En este ejemplo, todas las referencias a la zona horaria local se realizan por medio de la propiedad TimeZoneInfo.Local. La zona horaria local nunca se asigna a una variable de objeto. Este es un procedimiento recomendado, ya que otra llamada al método TimeZoneInfo.ClearCachedData invalida los objetos a los que está asignada la zona horaria local.

Compilación del código

Para este ejemplo se necesita:

  • La importación del espacio de nombres System con la instrucción using (necesario en el código de C#).

Consulte también