C# - Formatação de data e hora para uma cultura específica


 Neste artigo veremos como realizar a formatação de data e hora para uma cultura específica na linguagem C#.

A estrutura DateTime fornece métodos que permitem que seus aplicativos executem operações sensíveis à cultura em um tipo DateTime.

Um aplicativo pode usar a classe DateTimeFormatInfo para formatar e exibir um tipo DateTime com base na cultura.

Por exemplo, usando DateTimeFormatInfo.ShortDatePattern, a data de 1º de fevereiro de 2001, pode ser formatada como 1/2/2001 para inglês (Estados Unidos), "en-US", e 02/01/2001 para inglês (Reino Unido), "en-GB".

Um objeto DateTimeFormatInfo objeto pode ser criado para uma cultura específica ou para a cultura invariável, mas não para uma cultura neutra. Uma cultura neutra não fornece informações suficientes para exibir o formato de data correta. Uma exceção é lançada se o aplicativo tenta criar um DateTimeFormatInfo usando o objeto de uma cultura neutra.

Para especificar a cultura usamos a classe CultureInfo que fornece informações sobre uma cultura específica. As informações incluem os nomes da cultura, o sistema de escrita, o calendário usado, a ordem de classificação das cadeias de caracteres e a formatação de dados e números. A propriedade CultureInfo.CurrentCulture define o objeto CultureInfo que representa a cultura usada pela thread atual.

Vejamos como por essa teoria para funcionar na prática.

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um projeto do tipo Windows Forms App com o nome CShp_Datas

1- Exibindo os nomes dos dias da semana em português :

Vamos exibir em um controle Combobox os dias da semana em português usando a cultura ('pt-BR'):

Código do evento Click do botão - Preencher dias da semana :

        private void btnPreencherDiasSemana_Click(object sender, EventArgs e)
        {
            DateTime dia = DateTime.Now;
            CultureInfo idioma = new CultureInfo("pt-BR");
            for (int d = 1; d <= 7; d++)
            {
                dia = dia.AddDays(1);
                cboDiasSemana.Items.Add(dia.ToString("D", idioma));
            }
        }

Você pode alterar o formato da exibição usando uma formatação diferente no ToString(). Veja abaixo as opções :

strDate = dt.ToString("MM/dd/yyyy");                                          // 07/21/2007 
strDate = dt.ToString("dddd, dd MMMM yyyy");                           //Saturday, 21 July 2007
strDate = dt.ToString("dddd, dd MMMM yyyy HH:mm");               // Saturday, 21 July 2007 14:58
strDate = dt.ToString("dddd, dd MMMM yyyy hh:mm tt");             // Saturday, 21 July 2007 03:00 PM
strDate = dt.ToString("dddd, dd MMMM yyyy H:mm");                 // Saturday, 21 July 2007 5:01 
strDate = dt.ToString("dddd, dd MMMM yyyy h:mm tt");              // Saturday, 21 July 2007 3:03 PM
strDate = dt.ToString("dddd, dd MMMM yyyy HH:mm:ss");           // Saturday, 21 July 2007 15:04:10
strDate = dt.ToString("MM/dd/yyyy HH:mm");                             // 07/21/2007 15:05
strDate = dt.ToString("MM/dd/yyyy hh:mm tt");                           // 07/21/2007 03:06 PM
strDate = dt.ToString("MM/dd/yyyy H:mm");                               // 07/21/2007 15:07
strDate = dt.ToString("MM/dd/yyyy h:mm tt");                            // 07/21/2007 3:07 PM
strDate = dt.ToString("MM/dd/yyyy HH:mm:ss");                         // 07/21/2007 15:09:29
strDate = dt.ToString("MMMM dd");                                            // July 21
strDate = dt.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK");     // 2007-07-21T15:11:19.1250000+05:30    
strDate = dt.ToString("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'");  // Sat, 21 Jul 2007 15:12:16 GMT
strDate = dt.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss");                // 2007-07-21T15:12:57
strDate = dt.ToString("HH:mm");                                                 // 15:14
strDate = dt.ToString("hh:mm tt");                                               // 03:14 PM
strDate = dt.ToString("H:mm");                                                    // 5:15
strDate = dt.ToString("h:mm tt");                                                 // 3:16 PM
strDate = dt.ToString("HH:mm:ss");                                             // 15:16:29
strDate = dt.ToString("yyyy'-'MM'-'dd HH':'mm':'ss'Z'");               // 2007-07-21 15:17:20Z
strDate = dt.ToString("dddd, dd MMMM yyyy HH:mm:ss");          // Saturday, 21 July 2007 15:17:58
strDate = dt.ToString("yyyy MMMM");                                         // 2007 July

2- Exibindo das formatadas com base na cultura :

Em um novo formulário inclua os seguintes controles:

Vejamos o código do formulário :

a-) Evento Load do formulário que carrega a combobox cboCultura com os nomes das culturas :

        private void Form1_Load(object sender, EventArgs e)
        {
            // define as propriedades do ComboBox 
            cboCultura.DisplayMember = "DisplayName";
            cboCultura.ValueMember = "LCID";
            cboCultura.Sorted = true;
            // cria um array lista para os locales 
            ArrayList _locales = new ArrayList();
            // percorre as cultures 
            foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
            {
                // adiciona o objeto cultureinfo no arraylist 
                _locales.Add(culture);
            }
            // vincula o arraylist com o combobox 
            cboCultura.DataSource = _locales;
        }

b-) Evento DataChanged do controle MonthCalendar usado para obter e exibir a data selecionada no TextBox:

         private void mcal1_DateChanged(object sender, DateRangeEventArgs e)
        {
            txtDataSelecionada.Text = mcal1.SelectionRange.Start.ToLongDateString();
        }
 

c-) Na combobox cboFormato defina na propriedade Items os seguintes formatos:



d-) No evento Click do botão de comando - Exibir Data Formatada para a Cultura - inclua o código que vai aplicar a cultura e o formato e exibir a data formatada :

       private void btnExibirData_Click(object sender, EventArgs e)
        {
            CultureInfo idioma = new CultureInfo(cboCultura.Text);
            string formato = cboFormato.Text;
            txtDataFormatada.Text = mcal1.SelectionRange.Start.ToString(formato, idioma);
        }

Executando o projeto e selecionando uma cultura e formato iremos obter:

Pegue o projeto completo aqui : CShp_datas1.zip

"(Disse Jesus) - Quem ama a sua vida perdê-la-á, e quem neste mundo odeia a sua vida, guardá-la-á para a vida eterna."
João 12:25

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 ?

Referências:


José Carlos Macoratti