Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Trabalhar com sucesso com um fuso horário designado exige que a informação sobre esse fuso esteja disponível para o sistema. Os sistemas operativos Windows XP e Windows Vista armazenam esta informação no registo. No entanto, embora o número total de fusos horários existentes em todo o mundo seja grande, o registo contém informação apenas sobre um subconjunto deles. Além disso, o próprio registo é uma estrutura dinâmica cujo conteúdo está sujeito a alterações tanto deliberadas como acidentais. Como resultado, uma aplicação não pode sempre assumir que um determinado fuso horário está definido e disponível num sistema. O primeiro passo para muitas aplicações que utilizam aplicações de informação de fusos horários é determinar se existem os fusos horários necessários disponíveis no sistema local, ou fornecer ao utilizador uma lista de fusos horários a escolher. Isto exige que uma aplicação enumere os fusos horários definidos num sistema local.
Observação
Se uma aplicação depender da presença de um determinado fuso horário que pode não estar definido num sistema local, a aplicação pode garantir a sua presença serializando e desserializando informações sobre o fuso horário. O fuso horário pode então ser adicionado a um controlo de lista para que o utilizador da aplicação o possa selecionar. Para mais detalhes, veja Como: Guardar Fuso Horário num Recurso Embutido e Como: Restaurar Fuso Horário a partir de um recurso embutido.
Enumerar os fusos horários presentes no sistema local
Chame o método TimeZoneInfo.GetSystemTimeZones. O método devolve uma coleção genérica ReadOnlyCollection<T> de TimeZoneInfo objetos. As entradas da coleção estão ordenadas pelas suas DisplayName propriedades. Por exemplo:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZonesEnumere os objetos individuais TimeZoneInfo na coleção usando um
foreachloop (em C#) ou umFor Each...Nextloop (no Visual Basic), e realizar qualquer processamento necessário em cada objeto. Por exemplo, o código seguinte enumera a ReadOnlyCollection<T> coleção de TimeZoneInfo objetos devolvidos no passo 1 e lista o nome de exibição de cada fuso horário na consola.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
Apresentar ao utilizador uma lista de fusos horários presentes no sistema local
Chame o método TimeZoneInfo.GetSystemTimeZones. O método devolve uma coleção genérica ReadOnlyCollection<T> de TimeZoneInfo objetos.
Atribuir a coleção devolvida no passo 1 à propriedade
DataSourcede um controlo de formulários do Windows ou de lista ASP.NET.Recuperar o TimeZoneInfo objeto que o utilizador selecionou.
O exemplo fornece uma ilustração para uma aplicação Windows.
Exemplo
O exemplo inicia uma aplicação Windows que mostra os fusos horários definidos num sistema numa caixa de lista. O exemplo apresenta então uma caixa de diálogo que contém o valor da DisplayName propriedade do objeto fuso horário selecionado pelo utilizador.
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 controlos de lista (como o controlo System.Windows.Forms.ListBox ou System.Web.UI.WebControls.BulletedList) permite atribuir uma coleção de variáveis de objeto à sua propriedade DataSource, desde que essa coleção implemente a interface IEnumerable. (A classe genérica ReadOnlyCollection<T> faz isto.) Para exibir um objeto individual na coleção, o controlo chama o método desse ToString objeto para extrair a cadeia que é usada para representar o objeto. No caso dos TimeZoneInfo objetos, o ToString método devolve o TimeZoneInfo nome de exibição do objeto (o valor da sua DisplayName propriedade).
Observação
Como os controlos por lista chamam o método de ToString um objeto, pode atribuir uma coleção de TimeZoneInfo objetos ao controlo, fazer com que o controlo mostre um nome significativo para cada objeto e recuperar o TimeZoneInfo objeto que o utilizador selecionou. Isto elimina a necessidade de extrair uma cadeia para cada objeto da coleção, atribuir a cadeia a uma coleção que por sua vez é atribuída à propriedade do DataSource controlo, recuperar a cadeia selecionada pelo utilizador e depois usar essa cadeia para extrair o objeto que ela descreve.
Compilação do código
Este exemplo requer:
Que os seguintes namespaces sejam importados:
System (em C#)