Partager via


Procédure : résoudre des heures ambiguës

Une heure ambiguë est une heure qui correspond à plusieurs heures UTC. Cela se produit lorsque l’heure de l’horloge est retardée, comme lors du passage à 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 dans le cadre de l’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 correspond à 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 en 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 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

Cet exemple comprend une méthode nommée ResolveAmbiguousTime, qui détermine si la valeur DateTime qui lui est transmise est ambiguë ou non. 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 décalages possibles de l’heure ambiguë par rapport à l’heure UTC. 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 le décalage 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 autre appel à la méthode TimeZoneInfo.ClearCachedData invalide les objets auxquels le fuseau horaire local est assigné.

Voir aussi