Como: Enumerar fusos horários presentes em um computador
Trabalhar com êxito com um fuso horário designado requer que as informações sobre esse 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ários que existem em todo o mundo seja grande, o registro contém informações sobre apenas um subconjunto deles. Além disso, o próprio registo é uma estrutura dinâmica cujo conteúdo está sujeito a alterações deliberadas e acidentais. Como resultado, um aplicativo nem sempre pode assumir 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 dos quais selecionar. Isso requer que um aplicativo enumere os fusos horários definidos em um sistema local.
Nota
Se um aplicativo depende da presença de um fuso horário específico que pode não ser definido em um sistema local, o aplicativo pode garantir sua presença serializando e desserializando informações sobre o fuso horário. O fuso horário pode ser adicionado a um controle de lista para que o usuário do aplicativo possa selecioná-lo. Para obter detalhes, consulte Como salvar fusos horários em um recurso incorporado e Como restaurar fusos horários a partir de um recurso incorporado.
Para enumerar os fusos horários presentes no sistema local
Chame o TimeZoneInfo.GetSystemTimeZones método. O método retorna uma coleção genérica ReadOnlyCollection<T> de TimeZoneInfo objetos. As entradas na coleção são ordenadas por sua DisplayName propriedade. Por exemplo:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
Enumere os objetos individuais TimeZoneInfo na coleção usando um
foreach
loop (em C#) ou umFor Each
...Next
loop (no Visual Basic) e execute qualquer processamento necessário em cada objeto. Por exemplo, o código a seguir enumera a ReadOnlyCollection<T> coleção de objetos retornados TimeZoneInfo na etapa 1 e lista o nome para exibição de cada fuso horário no 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
Para apresentar ao usuário uma lista de fusos horários presentes no sistema local
Chame o TimeZoneInfo.GetSystemTimeZones método. O método retorna uma coleção genérica ReadOnlyCollection<T> de TimeZoneInfo objetos.
Atribua a coleção retornada na etapa 1 à
DataSource
propriedade de um controle de lista de formulários ou ASP.NET do Windows.Recupere o TimeZoneInfo objeto 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 uma caixa de diálogo que contém o valor da DisplayName propriedade do objeto de fuso horário selecionado pelo usuário.
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
A maioria dos controles de lista (como o System.Windows.Forms.ListBoxSystem.Web.UI.WebControls.BulletedList ou controle) permite que você atribua uma coleção de variáveis de objeto à sua DataSource
propriedade, desde que essa coleção implemente a IEnumerable interface. (A classe genérica ReadOnlyCollection<T> faz isso.) Para exibir um objeto individual na coleção, o controle chama o método desse objeto para extrair a cadeia de ToString
caracteres usada para representar o objeto. No caso de TimeZoneInfo objetos, o ToString
método retorna o TimeZoneInfo nome de exibição do objeto (o valor de sua DisplayName propriedade).
Nota
Como os controles de lista chamam o método de ToString
um objeto, você pode atribuir uma coleção de TimeZoneInfo objetos ao controle, fazer com que o controle exiba um nome significativo para cada objeto e recuperar o TimeZoneInfo objeto que o usuário selecionou. Isso elimina a necessidade de extrair uma cadeia de caracteres para cada objeto na coleção, atribuir a cadeia de caracteres a uma coleção que, por sua vez, é atribuída à propriedade do DataSource
controle, recuperar a cadeia de caracteres que o usuário selecionou e, em seguida, usar essa cadeia de caracteres para extrair o objeto que ele descreve.
Compilação do código
Este exemplo requer:
Que os seguintes namespaces sejam importados:
System (em código C#)