![]() |
Hoje veremos como criar datas e horas a partir de strings na linguagem C#. |
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)
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:
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:
VB .NET - Lendo Arquivos Binários - BinaryReader - Macoratti ...
Tratamento de arquivos - Questões práticas - Macoratti.net
C# - Copiando Arquivos - Macoratti
C# - Localizando linhas em um arquivo texto - Macoratti.net
VB .NET - Armazenando um objeto serializado em um arquivo
C# - Programa para Loja de Instrumentos Musicais - Macoratti ...
C# - Lendo e gravando dados binários no SQL ... - Macoratti