C# - Obtendo a data e a hora por TimeZone


 Neste artigo vou mostrar como podemos obter a data e hora por timezone usando a linguagem C#.

Vamos começar com a definição de Timezone ou fuso horário obtida aqui : https://pt.wikipedia.org/wiki/Fuso_hor%C3%A1rio

As zonas horárias ou fusos horários são cada uma das vinte e quatro áreas em que se divide a Terra e que seguem a mesma definição de tempo. O termo fuso denomina a porção de superfície esférica compreendida entre dois semiplanos que partem de um diâmetro da esfera, assemelhando-se à superfície externa de um gomo de laranja. Anteriormente, por volta do ano 1300, ou já antes, usava-se o tempo solar aparente, passagem meridiana do Sol, de forma que a hora do meio-dia se diferenciava de uma cidade para outra. Os fusos horários corrigiram em parte o problema ao colocar os relógios de cada região no mesmo tempo solar médio.

Na linguagem C# a classe TimeZone descreve e obtém informações sobre o fuso horário do computador atual.

Para obter o fuso horário do computador podemos usar a propriede TimeZone.CurrentTimeZone que retorna um objeto TimeZone que representa o fuso horário local.

Para obter o nome do fuso horário padrão usamos a propriedade TimeZone.StandardName e para obter o nome de exibição para o horário de verão do fuso horário atual usamos a propriedade TimeZone.DayLightName.

Podemos obter a hora atual da data em nosso fuso horário atual, usando a linha o seguinte código :  DateTime dataHora = DateTime.Now;   

Dessa forma, se desejarmos usar a hora da date de outro país, teremos que usar o método FindSystemTimeZoneById para recuperar a hora da data especifica passando o identificador de fuso horário. Esse método retorna um objeto TimeZoneInfo do registro com base no seu identificador.

Para obter uma lista dos ID´s TimeZone no seu computador usando o método FindTimeZoneById podemos usar o seguinte código :

 private void btnListarTimeZoneID_Click(object sender, EventArgs e)
 {
      foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())
              lbTimeZone.Items.Add(z.Id);
 }

Neste código temos um formulário contendo um ListBox (lbTimeZone) e um Button(btnListarZoneID) e usamos um laço foreach para listar os IDs timezones do computador.

Para obter uma lista completa dos time zones acesse esse link : https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx

Vamos supor que seu sistema esteja hospedado em um servidor que esta no Estados Unidos. Neste caso quando você usar o DateTime vai obter a data e horário dos EUA.

Como retornar a data e o horário do Brasil, afinal seus clientes estão no Brasil acessando o sistema que esta no EUA.

Basta converter para o fuso horário mais adequado que eu creio que seja o da América do Sul. Assim você usaria esse código :

TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time"))
Ou pode usar o código abaixo para obter o horário de Brasilía :
 DateTime dateTime = DateTime.UtcNow;
 TimeZoneInfo horaBrasilia = TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time");
 return TimeZoneInfo.ConvertTimeFromUtc(dateTime, horaBrasilia);

Vamos criar um pequeno projeto que mostra como obter a data e hora para um determinado fuso horário.

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Cshp_TimeZone;

Selecione o formulário Form1.vb e partir da ToolBox inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

A seguir declare os seguintes namespaces no formulário:

using System;
using System.Windows.Forms;

No evento Click do botão de comando -  Lista IDs TimeZone - inclua o código abaixo:

       private void btnListarTimeZoneID_Click(object sender, EventArgs e)
        {
            lbTimeZone.Items.Clear();
            foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())
                lbTimeZone.Items.Add(z.Id);

            btnDataHora.Enabled = true;
        }

Neste código limpamos o ListBox e preenchemos o mesmo com os Ids dos timezone existentes e concluímos habilitando o botão para obter a data e hora.

Agora no evento Click do botão - Obter Data e Hora para o Fuso horário selecionado - inclua o código abaixo:

        private void btnDataHora_Click(object sender, EventArgs e)
        {
            if (lbTimeZone.SelectedIndex != -1)
            {
                string fusoHorarioId = lbTimeZone.Text;
                TimeZoneInfo Standard_Time = TimeZoneInfo.FindSystemTimeZoneById(fusoHorarioId);
                DateTime dataHoraLocal = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, Standard_Time);
                lbDataHora.Items.Add("Data e Horário Local");
                lbDataHora.Items.Add("Para " + fusoHorarioId);
                lbDataHora.Items.Add(dataHoraLocal);
                lbDataHora.Items.Add("--------------------------------");
            }
            else
            {
                MessageBox.Show("Selecione um fuso horário");
            }
        }

Este código verifica se um fuso horário foi selecionado no listbox - lbTimeZone.

Havendo um fuso horário selecionado, obtemos o nome do seu ID e usamos o método FindSystemTimeZoneById para recuperar a hora da data especifica passando o identificador de fuso horário.

A seguir usamos o método ConvertTimeFromUtc para converter um Tempo Universal Coordenado (UTC) para a hora em um fuso horário especificado e exibimo o resultado no listbox lbDataHora.

Executando o projeto iremos obter o seguinte resultado para alguns fusos horários selecionados:

Pegue o projeto completo aqui :  Cshp_TimeZone.zip

Sabendo, amados irmãos, que a vossa eleição é de Deus;Porque o nosso evangelho não foi a vós somente em palavras, mas também em poder, e no Espírito Santo, e em muita certeza, como bem sabeis quais fomos entre vós, por amor de vós.
1 Tessalonicenses 1:4,5

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti