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
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: |
---|
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:
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 time regiões para um recurso inserido
Como: restauração time zonas a partir de um recurso inserido