Partilhar via


Como: Enumerar time zonas presente em um computador

Trabalhar com êxito com um fuso horário designado requer que informações sobre este fuso horário estejam disponíveis para o sistema.Os sistemas operacionais Windows XP e Windows Vista armazenam essas informações no Registro.No entanto, embora o número total de fusos horário que existem em todo o mundo seja grande, o registro contém informações sobre apenas um subconjunto deles.Além disso, o registro em si é uma estrutura dinâmica cujo conteúdo está sujeito a alterações tanto deliberadas quanto acidentais.Como resultado, um aplicativo não pode sempre presumir que um determinado fuso horário está definido e disponível em um sistema.A primeira etapa para muitos aplicativos que usam aplicativos de informações de fuso horário é determinar se os fusos horários necessários estão disponíveis no sistema local, ou fornecer ao usuário uma lista de fusos horários a partir do qual escolher.Isso requer que um aplicativo enumere os fusos horários definidos em um sistema local.

Observação:

Se um aplicativo depende da presença de um determinado fuso horário que não podem ser definidos em um sistema local, o aplicativo pode e nsure sua presença pela serialização e desserialização de informações sobre o fuso horário.O time zona pode ser adicionada a um controle de lista para que o usuário do aplicativo possa selecionar -lo.Para obter detalhes, consulte Como: Salvar time regiões para um recurso inserido e Como: restauração time zonas a partir de um recurso inserido.

Para enumerar os fusos horários presentes no sistema local

  1. Chame o método TimeZoneInfo.GetSystemTimeZones.O método retorna uma coleção genérica ReadOnlyCollection<T> de objetos TimeZoneInfo.As entradas na coleção são classificadas por sua propriedade DisplayName.Por exemplo:

    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
  2. Enumere os objetos TimeZoneInfo individuais na coleção usando um loop foreach (em C#) ou um loop For Each…Next (em Visual Basic), e execute qualquer processamento necessário em cada objeto.Por exemplo, o código a seguir enumera a coleção ReadOnlyCollection<T> dos objetos TimeZoneInfo retornados na etapa 1 e lista o nome de exibição de cada fuso horário no console.

    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 apresentar ao usuário uma lista de fusos horários presentes no sistema local

  1. Chame o método TimeZoneInfo.GetSystemTimeZones.O método retorna uma coleção genérica ReadOnlyCollection<T> de objetos TimeZoneInfo.

  2. Atribua a coleção retornada na etapa 1 para a propriedade DataSource de um controle de lista do Windows Forms ou do ASP.NET.

  3. Recupere o objeto TimeZoneInfo que o usuário selecionou.

O exemplo fornece uma ilustração para um aplicativo do Windows.

Exemplo

O exemplo inicia um aplicativo do Windows que exibe os fusos horários definidos em um sistema em uma caixa de listagem.O exemplo exibe, então, uma caixa de diálogo que contém o valor da propriedade DisplayName do objeto de fuso horário selecionado pelo usuário.

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.");
}

A maioria dos controles de lista (como o controle System.Windows.Forms.ListBox ou System.Web.UI.WebControls.BulletedList) permite que você atribua uma coleção de variáveis de objeto à sua propriedade DataSource desde que a coleção implemente a interface IEnumerable.(A classe ReadOnlyCollection<T> genérica faz isso.) Para exibir um objeto individual na coleção, o controle chama o método ToString desse objeto para extrair a sequência de caracteres que é usada para representar o objeto.No caso de objetos TimeZoneInfo, o método ToString retorna o nome de exibição do objeto TimeZoneInfo (o valor de sua propriedade DisplayName).

Observação:

Porque os controles de lista chamar um objeto ToString método, você pode atribuir um conjunto de TimeZoneInfo objetos para o controle tenha o controle exibir um nome significativo para cada objeto e recuperar o TimeZoneInfo objeto que o usuário tiver selecionado. Isso elimina a necessidade de extrair uma sequência de caracteres para cada objeto na coleção, atribuir a sequência de caracteres a uma coleção que por sua vez é atribuída à propriedade DataSource do controle, recuperar a sequência de caracteres que o usuário selecionou e, então, usar essa sequência de caracteres para extrair o objeto que ela descreve.

Compilando o código

Este exemplo requer:

Consulte também

Tarefas

Como: Salvar time regiões para um recurso inserido

Como: restauração time zonas a partir de um recurso inserido

Outros recursos

Horários e Zonas de Tempo