Neste artigo vou mostrar como podemos obter a data e hora por timezone usando a linguagem C#. |
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.
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:
2 LisbBox - lbTimeZone e lbDataHora
2 Button = btnListarTimeZoneID e btnDataHora, Enabled=false
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx
https://msdn.microsoft.com/pt-br/library/system.timezone.currenttimezone(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.timezoneinfo.daylightname(v=vs.110).aspx
https://msdn.microsoft.com/pt-br/library/system.timezoneinfo.findsystemtimezonebyid(v=vs.110).aspx
https://msdn.microsoft.com/pt-br/library/system.timezoneinfo.converttimefromutc(v=vs.110).aspx
VB .NET - Datas, horas: conceitos e operações - Macoratti.net