Comment : résoudre des heures ambiguës

Mise à jour : novembre 2007

Une heure ambiguë peut être mappée à plusieurs heures UTC (temps universel coordonné), notamment lorsque l'heure de l'horloge est reculée, comme lors du passage de l'heure d'été à l'heure d'hiver dans un fuseau horaire. Lorsque vous gérez une heure ambiguë, vous pouvez procéder de l'une des manières suivantes :

  • Proposez une méthode de mappage à l'heure UTC. Par exemple, vous pouvez supposer qu'une heure ambiguë est toujours exprimée en heure d'hiver du fuseau horaire.

  • Si l'heure ambiguë est un élément de données entré par l'utilisateur, vous pouvez laisser l'utilisateur résoudre l'ambiguïté.

Cette rubrique indique comment résoudre une heure ambiguë en supposant qu'elle représente l'heure d'hiver du fuseau horaire.

Pour mapper une heure ambiguë à l'heure d'hiver d'un fuseau horaire

  1. Appelez la méthode IsAmbiguousTime pour déterminer si l'heure est ambiguë.

  2. Si l'heure est ambiguë, soustrayez l'heure de l'objet TimeSpan retourné par la propriété BaseUtcOffset du fuseau horaire.

  3. Appelez la méthode static (Shared dans Visual Basic .NET) SpecifyKind pour affecter la valeur DateTimeKind.Utc à la propriété Kind de la valeur de date et d'heure UTC.

Exemple

L'exemple suivant illustre comment convertir une heure ambiguë en heure UTC en supposant qu'elle représente l'heure d'hiver du fuseau horaire 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;            
   }   
}

L'exemple représente une méthode nommée ResolveAmbiguousTime qui détermine si la valeur DateTime qui lui est passée est ambiguë. Si la valeur est ambiguë, la méthode retourne une valeur DateTime qui représente l'heure UTC correspondante. La méthode gère cette conversion en soustrayant de l'heure locale la valeur de la propriété BaseUtcOffset du fuseau horaire local.

En règle générale, il est possible de gérer une heure ambiguë en appelant la méthode GetAmbiguousTimeOffsets pour récupérer un tableau des objets TimeSpan qui contiennent les offsets UTC possibles de l'heure ambiguë. Toutefois, cet exemple émet l'hypothèse arbitraire qu'une heure ambiguë devrait toujours être mappée à l'heure d'hiver du fuseau horaire. La propriété BaseUtcOffset retourne l'offset entre l'heure UTC et l'heure d'hiver d'un fuseau horaire.

Dans cet exemple, toutes les références au fuseau horaire local sont faites via la propriété TimeZoneInfo.Local ; le fuseau horaire local n'est jamais assigné à une variable objet. Il est recommandé d'utiliser cette méthode, car un appel à la méthode TimeZoneInfo.ClearCachedData invalide les objets auxquels le fuseau horaire local est assigné.

Compilation du code

Cet exemple nécessite :

  • qu'une référence à System.Core.dll soit ajoutée au projet ;

  • que l'espace de noms System soit importé avec l'instruction using (requise en code C#).

Voir aussi

Tâches

Comment : permettre aux utilisateurs de résoudre des heures ambiguës

Autres ressources

Heures et fuseaux horaires