Procédure : énumérer les fuseaux horaires d’un ordinateur

Pour utiliser correctement un fuseau horaire désigné, le système doit pouvoir accéder aux informations le concernant. Les systèmes d’exploitation Windows XP et Windows Vista stockent ces informations dans le Registre. Il existe de nombreux fuseaux horaires dans le monde, mais le Registre contient des informations sur un sous-ensemble de ces fuseaux horaires uniquement. De plus, le Registre est une structure dynamique dont le contenu peut être modifié délibérément ou accidentellement. Par conséquent, une application ne peut pas toujours supposer qu’un fuseau horaire particulier est défini et disponible sur un système. Pour de nombreuses applications qui utilisent des informations de fuseau horaire, il convient en premier lieu de déterminer si les fuseaux horaires requis sont disponibles sur le système local ou de fournir à l’utilisateur la liste des fuseaux horaires qu’il peut sélectionner. Il faut donc qu’une application énumère les fuseaux horaires définis sur un système local.

Notes

Si une application s’appuie sur la présence d’un fuseau horaire particulier qui peut ne pas être défini sur un système local, l’application peut garantir sa présence en sérialisant et en désérialisant les informations sur le fuseau horaire. Le fuseau horaire peut ensuite être ajouté à un contrôle de liste afin que l’utilisateur de l’application puisse le sélectionner. Pour plus d’informations, consultez Guide pratique pour enregistrer des fuseaux horaires dans une ressource incorporée et comment : restaurer des fuseaux horaires à partir d’une ressource incorporée.

Pour énumérer les fuseaux horaires présents sur le système local

  1. Appelez la méthode TimeZoneInfo.GetSystemTimeZones . La méthode ReadOnlyCollection<T> retourne une collection générique d’objets TimeZoneInfo. Les entrées présentes dans la collection sont triées par leur propriété DisplayName. Par exemple :

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Énumérez les objets TimeZoneInfo individuels de la collection à l’aide d’une boucle foreach (en C#) ou d’une boucle For EachNext (en Visual Basic), et exécutez tous les traitements nécessaires sur chaque objet. Par exemple, le code suivant énumère la collection ReadOnlyCollection<T> d’objets TimeZoneInfo retournée à l’étape 1 et répertorie le nom complet de chaque fuseau horaire sur la console.

    foreach (TimeZoneInfo timeZone in tzCollection)
        Console.WriteLine($"   {timeZone.Id}: {timeZone.DisplayName}");
    
    For Each timeZone As TimeZoneInfo In tzCollection
        Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
    Next
    

Pour présenter à l’utilisateur une liste de fuseaux horaires présents sur le système local

  1. Appelez la méthode TimeZoneInfo.GetSystemTimeZones . La méthode ReadOnlyCollection<T> retourne une collection générique d’objets TimeZoneInfo.

  2. Affectez la collection retournée à l’étape 1 à la propriété DataSource d’un contrôle de liste Windows Forms ou ASP.NET.

  3. Récupérez l’objet TimeZoneInfo que l’utilisateur a sélectionné.

L’exemple fournit une illustration pour une application Windows.

Exemple

L’exemple démarre une application Windows qui affiche les fuseaux horaires définis sur un système dans une zone de liste. L’exemple affiche ensuite une boîte de dialogue qui contient la valeur de la propriété DisplayName de l’objet de fuseau horaire sélectionné par l’utilisateur.

private void Form1_Load(object sender, EventArgs e)
{
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    _timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
    TimeZoneInfo? selectedTimeZone = (TimeZoneInfo?)_timeZoneList.SelectedItem;
    MessageBox.Show($"You selected the {selectedTimeZone?.ToString()} time zone.");
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo)
    tzCollection = TimeZoneInfo.GetSystemTimeZones()
    Me.timeZoneList.DataSource = tzCollection
End Sub

Private Sub OkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkButton.Click
    Dim selectedTimeZone As TimeZoneInfo = DirectCast(Me.timeZoneList.SelectedItem(), TimeZoneInfo)
    MsgBox("You selected the " & selectedTimeZone.ToString() & " time zone.")
End Sub

La plupart des contrôles de liste (comme le contrôle System.Windows.Forms.ListBox ou System.Web.UI.WebControls.BulletedList ) vous permettent d’affecter une collection de variables d’objet à leur propriété DataSource tant que cette collection implémente l’interface IEnumerable. (La classe ReadOnlyCollection<T> générique effectue cette opération.) Pour afficher un objet individuel dans la collection, le contrôle appelle la méthode ToString de cet objet pour extraire la chaîne utilisée pour représenter l’objet. Dans le cas d’objets TimeZoneInfo, la méthode ToString retourne le nom d’affichage de l’objet TimeZoneInfo (la valeur de sa propriété DisplayName).

Notes

Étant donné que les contrôles de liste appellent la méthode ToString d’un objet, vous pouvez affecter une collection d’objets TimeZoneInfo au contrôle, afficher un nom explicite pour chaque objet et récupérer l’objet TimeZoneInfo sélectionné par l’utilisateur. Cela élimine la nécessité d’extraire une chaîne pour chaque objet de la collection, d’affecter la chaîne à une collection qui est à son tour affectée à la propriété DataSource du contrôle, de récupérer la chaîne sélectionnée par l’utilisateur, puis d’utiliser cette chaîne pour extraire l’objet qu’elle décrit.

Compilation du code

Cet exemple nécessite :

Voir aussi