Share via


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

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

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

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

Otros recursos

Horas y zonas horarias