Cómo: Resolver horas ambiguas
Actualización: noviembre 2007
Una hora ambigua es aquella que corresponde a más de una hora universal coordinada (UTC). Se produce al retrasar los relojes, como en el cambio de horario de verano a horario estándar. Para tratar una hora ambigua, puede elegir una de las siguientes acciones:
Haga una suposición sobre cómo corresponde la hora a la hora UTC. Por ejemplo, puede suponer que una hora ambigua siempre se expresa en la hora estándar de la zona horaria.
Si la hora ambigua es un elemento de datos especificado por el usuario, puede dejar que el usuario resuelva la ambigüedad.
En este tema se muestra cómo resolver una hora ambigua suponiendo que representa la hora estándar de la zona horaria.
Para asignar una hora ambigua a una hora estándar de la zona horaria
Llame al método IsAmbiguousTime para determinar si la hora es ambigua.
Si la hora es ambigua, reste la hora del objeto TimeSpan devuelto por la propiedad BaseUtcOffset de la zona horaria.
Llame al método static (Shared en Visual Basic .NET) SpecifyKind para establecer la propiedad Kind del valor de fecha y hora UTC en DateTimeKind.Utc.
Ejemplo
El ejemplo siguiente muestra cómo convertir una hora ambigua en una hora UTC suponiendo que representa la hora estándar de la zona horaria 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;
}
}
El ejemplo está compuesto por un método denominado ResolveAmbiguousTime, que determina si el valor de DateTime que se le ha pasado es ambiguo. Si el valor es ambiguo, el método devuelve un valor de 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 trata llamando al método GetAmbiguousTimeOffsets para recuperar una matriz de objetos TimeSpan que contienen la posible diferencia de la hora ambigua respecto a la hora UTC. Sin embargo, en este ejemplo se supone que una hora ambigua siempre se debe asignar 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 la zona horaria.
En este ejemplo, todas las referencias a la zona horaria local se realizan a través de la propiedad TimeZoneInfo.Local; la zona horaria local nunca se asigna a una variable de objeto. Éste es un procedimiento recomendado porque una llamada al método TimeZoneInfo.ClearCachedData invalida todos los objetos a los que la zona horaria local está asignada.
Compilar el código
Para este ejemplo se necesita:
Que se agregue al proyecto una referencia a System.Core.dll.
Que se importe el espacio de nombres System con la instrucción using (requerida en código de C#).
Vea también
Tareas
Cómo: Permitir que los usuarios resuelvan horas ambiguas