C# - Criando Datas e Horas a partir de Strings
Hoje veremos como criar datas e horas a partir de strings na linguagem C#.

Para poder criar uma instância de System.DateTime que representa a hora e a data especificada em uma string podemos usar os métodos Parse e ParseExact da classe DateTime.

Antes de prosseguir quero deixar um alerta sobre problemas sutis que podem aparecer associados ao uso da classe DateTime para representa datas e horas.  Embora os métodos Parse e ParseExact criem objetos DateTime a partir de strings, conforme iremos mostrar  você deve ter cuidado ao usar os objetos DateTime resultantes no seu programa.

Para mais detalhes veja o artigo : "Práticas recomendadas de codificação usando o DateTime no .NET Framework” (a artigo está em inglês)  

As Datas e horários podem ser representados como texto de várias maneiras diferentes.

Por exemplo, 1º de junho de 2015, 1/6/2015, 1/6/2015 e 1-jun-2015 são todas representações possíveis da mesma data e 16:43 e 4:43 p.m podem ambos ser usados ​​para representar o mesmo horário.

O método Parse se esforça para gerar um objeto DateTime a partir de uma determinada string mesmo se a string contiver informações parciais ou incorretas e vai tentar substituir quaisquer valores ausentes por valores padrões.

Após todos os esforços, se o Parse não puder criar um objeto DateTime, ele lançará uma exceção System.FormatException.

A sobrecarga mais simples do método Parse recebe uma string:  Parse(String)

Nota: Se a cadeia de caracteres de entrada representa um dia bissexto em um ano bissexto no calendário usado pelo método de análise, o método Parse analisa a cadeia de caracteres com êxito. Se a cadeia de caracteres de entrada representa um dia bissexto em um ano não bissexto, o método lançará um FormatException.

Todas as sobrecargas do método Parse são sensíveis à cultura, a menos que a cadeia de caracteres a ser analisada esteja de acordo com o padrão ISO 8601.

Já o método ParseExact converte a representação da string especificada de uma data e hora no seu DateTime equivalente. O formato da representação da string deverá corresponder exatamente a um formato especificado ou uma exceção será gerada.

A sobrecarga mais simples deste método usa 3 argumentos:

ParseExact(String, String, IFormatProvider)

  1. A data e hora no formato string a ser convertida;
  2. Um formato string que especifica a estrutura que a hora e a data devem ter;
  3. Uma referência IFormatProvider que fornece informação especifica da cultura. Se o valor for null será usado a cultura atual da thread;

A hora e a data devem atender aos requisitos especificados na string de formato, caso contrário o ParseExact
lançar uma exceção System.FormatException.

A seguir vamos criar um projeto C# do tipo Console na plataforma .NET Core e veremos um exemplo que demonstra a flexibilidade dos métodos Parse e ParseExact.

recursos usados:

  • Visual Basic 2019 Community Edition

Criando o projeto C# no VS 2019

Crie um projeto Console do tipo .NET Core chamado CShp_DataHoraString;

Inclua o código a seguir no método Main da classe Program:

        static void Main(string[] args)
        {
            Teste_Metodo_Parse();
            Teste_Metodo_ParseExact();
            ReadLine();
        }

Os namespaces usados são:

using System;
using System.Globalization;
using static System.Console;


Agora vamos definir o código do método
Teste_Metodo_Parse :

       private static void Teste_Metodo_Parse()
        {
            try
            {
                string ds1 = "Set 2019";
                string ds2 = "07:22:16";
                string ds3 = "5,9,19";
                string ds4 = "5/9/2019 14:15:33";
                string ds5 = "2:15 PM";
                WriteLine($"Hoje é {DateTime.Now:d}\n");
                DateTime dt1 = DateTime.Parse(ds1);
                DateTime dt2 = DateTime.Parse(ds2);
                DateTime dt3 = DateTime.Parse(ds3);
                DateTime dt4 = DateTime.Parse(ds4);
                DateTime dt5 = DateTime.Parse(ds5);
                // Exibe os objetos convertidos
                WriteLine($"String: {ds1} DateTime: {dt1}");
                WriteLine($"String: {ds2} DateTime: {dt2}");
                WriteLine($"String: {ds3} DateTime: {dt3}");
                WriteLine($"String: {ds4} DateTime: {dt4}");
                WriteLine($"String: {ds5} DateTime: {dt5}");
            }
            catch (FormatException fex)
            {
                WriteLine(fex.Message);
            }
        }

O resultado obtido é visto abaixo:

E a seguir o código do método Teste_Metodo_ParseExact :

       private static void Teste_Metodo_ParseExact()
        {
            string dataString, formato;
            DateTime resultado;
            CultureInfo provider = CultureInfo.InvariantCulture;
            // Faz o parse somente da data com cultura invariant
            dataString = "06/15/2008";
            formato = "d";
            try
            {
                resultado = DateTime.ParseExact(dataString, formato, provider);
                WriteLine($"{dataString} converte para {resultado.ToString()}");
            }
            catch (FormatException)
            {
                WriteLine($"{dataString} não esta no formato correto.");
            }
            // Faz o parse da data e hora com um formato especifico
            dataString = "Sun 15 Jun 2008 8:30 AM -06:00";
            formato = "ddd dd MMM yyyy h:mm tt zzz";
            try
            {
                resultado = DateTime.ParseExact(dataString, formato, provider);
                WriteLine($"{dataString} converte para {resultado.ToString()}");
            }
            catch (FormatException)
            {
                WriteLine($"{dataString} não esta no formato correto.");
            }
            dataString = "15/06/2008 08:30";
            formato = "g";
            provider = new CultureInfo("fr-FR");
            try
            {
                resultado = DateTime.ParseExact(dataString, formato, provider);
                WriteLine($"{dataString} converte para {resultado.ToString()}");
            }
            catch (FormatException)
            {
                WriteLine($"{dataString} não esta no formato correto.");
            }
            // Faz o parse e inclui segundos e milisegundos
            // usando o formato Frances e cultura invariante
            dataString = "18/08/2015 06:30:15.006542";
            formato = "dd/MM/yyyy HH:mm:ss.ffffff";
            try
            {
                resultado = DateTime.ParseExact(dataString, formato, provider);
                WriteLine($"{dataString} converte para {resultado.ToString()}");
            }
            catch (FormatException)
            {
                WriteLine($"{dataString} não esta no formato correto.");
            }
        }

O resultado obtido é visto abaixo:

Pegue o código do projeto aqui:  CShp_DataHoraString.zip

Referências:


José Carlos Macoratti