Partager via


Guide pratique : Obtenir un objet TimeZoneInfo

La façon la plus courante d’obtenir un objet TimeZoneInfo consiste à récupérer les informations le concernant à partir du registre. Pour obtenir l’objet, appelez la méthode static (Shared dans Visual Basic) TimeZoneInfo.FindSystemTimeZoneById, qui effectue une recherche dans le registre. Gérez toutes les exceptions levées par la méthode, en particulier l’exception TimeZoneNotFoundException qui est levée si le fuseau horaire n’est pas défini dans le registre.

Remarque

À compter de .NET 8, TimeZoneInfo.FindSystemTimeZoneById retourne un objet TimeZoneInfo mis en cache au lieu d’instancier un nouvel objet. Pour plus d’informations, consultez FindSystemTimeZoneById ne retourne pas de nouvel objet.

Exemple

Le code suivant récupère un objet TimeZoneInfo qui représente le fuseau horaire EST et affiche l’heure EST qui correspond à l’heure locale.

DateTime timeNow = DateTime.Now;
try
{
    TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime easternTimeNow = TimeZoneInfo.ConvertTime(
        timeNow,
        TimeZoneInfo.Local,
        easternZone
        );
    Console.WriteLine("{0} {1} corresponds to {2} {3}.",
                      timeNow,
                      TimeZoneInfo.Local.IsDaylightSavingTime(timeNow) ?
                                TimeZoneInfo.Local.DaylightName :
                                TimeZoneInfo.Local.StandardName,
                      easternTimeNow,
                      easternZone.IsDaylightSavingTime(easternTimeNow) ?
                                  easternZone.DaylightName :
                                  easternZone.StandardName);
}
// Handle exception
//
// As an alternative to simply displaying an error message, an alternate Eastern
// Standard Time TimeZoneInfo object could be instantiated here either by restoring
// it from a serialized string or by providing the necessary data to the
// CreateCustomTimeZone method.
catch (TimeZoneNotFoundException)
{
    Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.");
}
catch (InvalidTimeZoneException)
{
    Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.");
}
catch (SecurityException)
{
    Console.WriteLine("The application lacks permission to read time zone information from the registry.");
}
catch (OutOfMemoryException)
{
    Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.");
}
// If we weren't passing FindSystemTimeZoneById a literal string, we also
// would handle an ArgumentNullException.
Dim timeNow As Date = Date.Now
Try
    Dim easternZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
    Dim easternTimeNow As Date = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local, easternZone)
    Console.WriteLine("{0} {1} corresponds to {2} {3}.", _
                      timeNow, _
                      IIf(TimeZoneInfo.Local.IsDaylightSavingTime(timeNow), _
                          TimeZoneInfo.Local.DaylightName, TimeZoneInfo.Local.StandardName), _
                      easternTimeNow, _
                      IIf(easternZone.IsDaylightSavingTime(easternTimeNow), _
                          easternZone.DaylightName, easternZone.StandardName))
    ' Handle exception
    '
    ' As an alternative to simply displaying an error message, an alternate Eastern
    ' Standard Time TimeZoneInfo object could be instantiated here either by restoring
    ' it from a serialized string or by providing the necessary data to the
    ' CreateCustomTimeZone method.
Catch e As TimeZoneNotFoundException
    Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.")
Catch e As InvalidTimeZoneException
    Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.")
Catch e As SecurityException
    Console.WriteLine("The application lacks permission to read time zone information from the registry.")
Catch e As OutOfMemoryException
    Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.")
    ' If we weren't passing FindSystemTimeZoneById a literal string, we also 
    ' would handle an ArgumentNullException.
End Try

Le paramètre unique de la méthode TimeZoneInfo.FindSystemTimeZoneById est l’identificateur du fuseau horaire que vous souhaitez récupérer, qui correspond à la propriété TimeZoneInfo.Id de l’objet. L'identificateur de fuseau horaire est un champ clé qui identifie le fuseau horaire de manière unique. Alors que la plupart des clés sont relativement courtes, l'identificateur de fuseau horaire est long. Dans la plupart des cas, sa valeur correspond à la propriété StandardName d’un objet TimeZoneInfo , qui est utilisée pour fournir le nom de l’heure standard du fuseau horaire. Toutefois, il existe des exceptions. Pour vous assurer que l’identificateur fourni est valide, il est recommandé d’énumérer les fuseaux horaires disponibles sur votre système et de noter les identificateurs associés. Pour voir un exemple, consultez How to: Enumerate time zones present on a computer. L’article Rechercher les fuseaux horaires définis sur un système local contient également une liste d’identificateurs de fuseau horaire sélectionnés.

Si le fuseau horaire est trouvé, la méthode renvoie son objet TimeZoneInfo . Si le fuseau horaire n’est pas trouvé, la méthode lève une exception TimeZoneNotFoundException. Si le fuseau horaire est trouvé, mais que ses données sont endommagées ou incomplètes, la méthode lève une exception InvalidTimeZoneException.

Si votre application repose sur un fuseau horaire qui doit être présent, vous devez d’abord appeler la méthode FindSystemTimeZoneById pour récupérer les informations de fuseau horaire à partir du registre. Si l’appel de méthode échoue, votre gestionnaire d’exceptions doit alors créer une nouvelle instance du fuseau horaire ou le recréer en désérialisant un objet TimeZoneInfo sérialisé. Consultez Guide pratique pour restaurer des fuseaux horaires à partir d’une ressource incorporée pour obtenir un exemple.

Voir aussi