Como: Enumerar os fusos horários presentes 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 pode ser definido em um sistema local, o aplicativo pode assegurar sua presença ao serializar e desserializar informações sobre o fuso horário.O fuso horário pode, então, ser adicionado a um controle de lista para que o usuário do aplicativo possa selecioná-lo.Para obter detalhes, consulte Como: Salvar os fusos horários para um recurso incorporado e Como: Restaurar os fusos horários de um recurso incorporado.
Para enumerar os fusos horários presentes no sistema local
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();
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
Chame o método TimeZoneInfo.GetSystemTimeZones. O método retorna uma coleção genérica ReadOnlyCollection<T> de objetos TimeZoneInfo.
Atribua a coleção retornada na etapa 1 para a propriedade DataSource de um controle de lista do Windows Forms ou do ASP.NET.
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
Como controles de lista chamam um método ToString do objeto, você pode atribuir uma coleção de objetos TimeZoneInfo ao controle, fazer o controle exibir um nome significativo para cada objeto, e recuperar o objeto TimeZoneInfo que o usuário selecionou.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:
Que uma referência a System.Core.dll seja adicionada ao projeto.
Que os seguintes espaços de nome sejam importados:
System (em código C#).
Consulte também
Tarefas
Como: Salvar os fusos horários para um recurso incorporado
Como: Restaurar os fusos horários de um recurso incorporado