Comment : instancier un objet TimeZoneInfo

La méthode la plus courante pour instancier un objet TimeZoneInfo est de récupérer les informations correspondantes dans le Registre. Cette rubrique explique comment instancier un objet TimeZoneInfo à partir du Registre du système local.

Pour instancier un objet TimeZoneInfo

  1. Déclarez un objet TimeZoneInfo.

  2. Appelez la méthode static (Shared dans Visual Basic) TimeZoneInfo.FindSystemTimeZoneById.

  3. Gérez toutes les exceptions levées par la méthode, en particulier TimeZoneNotFoundException qui se produit si le fuseau horaire n'est pas défini dans le Registre.

Exemple

Le code suivant récupère un objet TimeZoneInfo qui représente le fuseau horaire de la côte est des États-Unis et affiche l'heure de la côte est qui correspond à l'heure locale.

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

Le seul paramètre de la méthode TimeZoneInfo.FindSystemTimeZoneById est l'identificateur du fuseau horaire que vous souhaitez récupérer. Il 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 de l'objet TimeZoneInfo, utilisée pour fournir le nom de l'heure standard du fuseau horaire. Mais il existe des exceptions. Pour vous assurer que l'identificateur fourni est valide, il est conseillé d'énumérer les fuseaux horaires disponibles sur votre système et de noter les identificateurs des fuseaux horaires qui s'y trouvent. Pour une illustration, consultez Comment : énumérer les fuseaux horaires d'un ordinateur. La rubrique « Recherche des fuseaux horaires définis sur un système local » propose également une liste des identificateurs de fuseau horaire sélectionnés.

Si le fuseau horaire est trouvé, la méthode retourne son objet TimeZoneInfo. Dans le cas contraire, 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 dépend de la présence d'un fuseau horaire, vous devez d'abord appeler la méthode FindSystemTimeZoneById pour récupérer les informations de fuseau horaire dans le Registre. Si l'appel de méthode échoue, votre gestionnaire d'exceptions doit créer une nouvelle instance du fuseau horaire ou le recréer en désérialisant un objet TimeZoneInfo sérialisé. Pour obtenir un exemple, consultez Comment : restaurer des fuseaux horaires dans une ressource incorporée.

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 : accéder aux objets UTC et aux objets de fuseau horaire local prédéfinis

Concepts

Recherche des fuseaux horaires définis sur un système local

Autres ressources

Dates, heures et fuseaux horaires