Share via


Cómo: Enumerar zonas horarias presentes en un equipo

Actualización: noviembre 2007

Para trabajar correctamente con una zona horaria designada, es necesario que la información sobre esa zona horaria esté disponible para el sistema. Los sistemas operativos Windows Vista y Windows XP almacenan esta información en el Registro. Sin embargo, aunque el número total de zonas horarias que existen en el mundo es grande, el Registro sólo contiene información de un subconjunto de ellas. Además, el propio Registro es una estructura dinámica cuyo contenido está sujeto a cambios intencionados y accidentales. Como resultado, una aplicación no puede suponer siempre que una zona horaria determinada esté definida y disponible en un sistema. El primer paso para muchas aplicaciones que utilizan aplicaciones con información de zona horaria es determinar si las zonas horarias necesarias están disponibles en el sistema local, o proporcionar una lista de zonas horarias para que el usuario seleccione. Para ello, una aplicación debe enumerar las zonas horarias definidas en un sistema local.

Nota:

Si una aplicación confía en la presencia de una zona horaria determinada que podría no estar definida en un sistema local, la aplicación puede garantizar su presencia serializando y deserializando la información sobre la zona horaria. Después, la zona horaria se puede agregar a un control de lista para que el usuario de la aplicación pueda seleccionarla. Para obtener información detallada, vea Cómo: Guardar zonas horarias en un recurso incrustado y Cómo: Restaurar zonas horarias de un recurso incrustado.

Para enumerar las zonas horarias presentes en el sistema local

  1. Llame al método TimeZoneInfo.GetSystemTimeZones. El método devuelve una colección ReadOnlyCollection<T> genérica de objetos TimeZoneInfo. La propiedad DisplayName ordena las entradas de la colección. Por ejemplo:

    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
  2. Enumere los objetos TimeZoneInfo individuales de la colección utilizando un bucle foreach (en C#) o un bucle For Each. Next (en Visual Basic) y realice los procesos necesarios en cada objeto. Por ejemplo, el siguiente código enumera la colección ReadOnlyCollection<T> de objetos TimeZoneInfo devuelta en el paso 1 y enumera el nombre para mostrar de cada zona horaria en la consola.

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

Para mostrar al usuario una lista de zonas horarias presentes en el sistema local

  1. Llame al método TimeZoneInfo.GetSystemTimeZones. El método devuelve una colección ReadOnlyCollection<T> genérica de objetos TimeZoneInfo.

  2. Asigne la colección devuelta en el paso 1 a la propiedad DataSource de un control de formularios Windows Forms o de un control de lista de ASP.NET.

  3. Recupere el objeto TimeZoneInfo que el usuario ha seleccionado.

En el ejemplo se muestra una ilustración de una aplicación para Windows.

Ejemplo

En el ejemplo se inicia una aplicación para Windows que muestra las zonas horarias definidas en un sistema en un cuadro de lista. A continuación, se muestra un cuadro de diálogo que contiene el valor de la propiedad DisplayName del objeto de zona horaria seleccionado por el usuario.

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
private void Form1_Load(object sender, EventArgs e)
{
   ReadOnlyCollection<TimeZoneInfo> tzCollection; 
   tzCollection = TimeZoneInfo.GetSystemTimeZones();
   this.timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
   TimeZoneInfo selectedTimeZone = (TimeZoneInfo) this.timeZoneList.SelectedItem;
   MessageBox.Show("You selected the " + selectedTimeZone.ToString() + " time zone.");
}

La mayoría de los controles de lista (como el control System.Windows.Forms.ListBox o System.Web.UI.WebControls.BulletedList ) permiten asignar una colección de variables de objeto a su propiedad DataSource siempre que esa colección implemente la interfaz IEnumerable. (La clase ReadOnlyCollection<T> genérica realiza esta acción). Para mostrar un objeto individual de la colección, el control llama al método ToString de ese objeto para extraer la cadena utilizada para representar el objeto. En el caso de objetos TimeZoneInfo, el método ToString devuelve el nombre para mostrar TimeZoneInfo del objeto (el valor de su propiedad DisplayName).

Nota:

Debido a que los controles de lista llaman al método ToString de un objeto, puede asignar una colección de objetos TimeZoneInfo al control, hacer que el control muestre un nombre descriptivo para cada objeto, y recuperar el objeto TimeZoneInfo que el usuario ha seleccionado. Esto elimina la necesidad de extraer una cadena para cada objeto de la colección, asignar la cadena a una colección que, a su vez, está asignada a la propiedad DataSource del control, recuperar la cadena que el usuario ha seleccionado y, a continuación, utilizar esta cadena para extraer el objeto que describe.

Compilar el código

Para este ejemplo se necesita:

Vea también

Tareas

Cómo: Guardar zonas horarias en un recurso incrustado

Cómo: Restaurar zonas horarias de un recurso incrustado

Otros recursos

Horas y zonas horarias