Trabalhando com datas no C#

Trabalhar com programas que armazenam, utilizam e manipulam datas pode ser uma tarefa complicada. Felizmente no .NET Framework temos a classe System.DateTime que facilita muito o trabalho com datas, desde a representação delas dentro do programa até a sua manipulção através de operações como somas e subtrações.

Declarando e inicializando datas

Declarar uma variável de data é uma tarefa extremamente simples, basta informar o tipo DateTime (ou System.DateTime) e o nome da variável. A variável DateTime é representada por uma estrutura na bilbioteca de classes do .NET e possui uma série de métodos estáticos e não estáticos que permitem a sua manipulação. Dentre as possibilidades da estrutura de datas o próprio construtor já apresenta uma série de possibilidades para podermos inicializar uma estrutura de datas. Veja o exemplo a seguir.
// Inicializa a data com ano, mês e dia
DateTime data1 = new DateTime(2007, 1, 21);
// Inicializa a data com ano, mês, dia, hora, minuto e segundo
DateTime data2 = new DateTime(2007, 1, 21, 20, 47, 35);
// Inicializa a data com um número de nano-segundos
DateTime data3 = new DateTime(123456789);

Também é possivel inicializar a variável com a data e hora atual através dos métodos estáticos Now e Today. O método Now representa e data e hora atuais, já o método Today representa apenas a data sem o componente da hora.

// Inicializa a data e hora atuais
DateTime dataAgora = DateTime.Now;
// Inicializa a data atual
DateTime dataHoje = DateTime.Today;

Após a inicialização da data é possível obtermos os componentes da data separadamente através das propriedades da variável de data, conforme o exemplo a seguir.

int hora = data1.Hour;
int dia = data1.Day;
int mes = data1.Month;
int ano = data1.Year;

Convertendo datas a partir de strings

Um dos problemas mais comuns que encontramos em linguagens de programação é a conversão de datas a partir de variáveis string. A estrutura DateTime possui uma função chamada Parse que permite a conversão direta de uma variável string para o tipo DateTime, conforme o exemplo a seguir.

DateTime data = DateTime.Parse(“21/1/2008”);

O problema da função Parse é que ela está diretamente relacionada as configurações regionais do usuário que está executando o programa. Em função disto a conversão pode apresentar problemas caso o usuário esteja com alguma configuração regional diferente, por exemplo, quando estiver em um windows em idioma inglês. Para evitar este tipo de problema, podemos utilizar a função ParseExact, onde devemos explicitar o formato a partir do qual a data será convertida. Veja o exemplo a seguir.

DateTime data = DateTime.Parse(“21/01/2008”,
“dd/MM/yyyy”,
System.Globalization.CultureInfo.InvariantCulture);

DateTime data = DateTime.Parse(“2008-01-20 21:12:34”,
“yyyy-MM-dd HH:mm:ss”,
System.Globalization.CultureInfo.InvariantCulture);

Adicionando componentes a uma data

A partir de uma variável data é possível adicionarmos dias, meses, anos, horas, minutos, etc. Para adicionarmos estas componentes a uma estrutura de datas devemos utilizar os métodos AddXXX correspondentes (ex. AddDays, Addyear, AddMinutes). O exemplo a seguir mostra a utilização destes métodos.

data1 = data1.AddDays(25);
data1 = data1.AddHours(5);
data1 = data1.AddMonths(14);
data1 = data1.AddMinutes(8);

Para diminuirmos alguma componente da data, basta informarmos os valores dos parâmetros como números negativos.

data1 = data1.AddDays(-25);
data1 = data1.AddHours(-5);
data1 = data1.AddMonths(-14);
data1 = data1.AddMinutes(-8);

Descobrindo a diferença entre datas

Outro método bastante útil na classe DateTime é o método Subtract que permite a Substração de uma data a partir de outra. Através deste método podemos descobrir quanto tempo transcorreu entre uma data e outra. O resultado desta operação é outra estrutura bastante útil, a estrutura Timespan.

DateTime dataAgora = DateTime.Now;
DateTime dataNascimento = new DateTime(1978, 11, 7);

Timespan ts = dataAgora.Subtract(dataNascimento);

A estrutura Timespan representa um intervalo de tempo. No caso de uma diferença entre datas, ela representa o tempo transcorrido entre uma data e outra.

int horasInteiras = ts.Hours;
double horasTotais = ts.TotalHours;

No exemplo acima obtivemos o total de horas transcorridas entre uma data e outra (propriedade TotalHours) e o total de horas inteiras (propriedade Hours, sem a fração).

Uma observação interessante é que a classe Timespan não possui o total de anos ou meses transcorridos. Isto ocorre porque o número de dias em um ano é variável e por isso a classe não apresenta este tipo de suporte. E se quisessemos calcular o total de anos entre a data de nascimento de alguém e a data de hoje (ou para ser mais exatado, a idade de uma pessoa). Neste caso não teriamos outra opção senão recorrer para o artificio de um comando if, conforme o exemplo a seguir.

DateTime dataAgora = DateTime.Now;
DateTime dataNascimento = new DateTime(1978, 11, 7);
int idade = 0;

if (dataNascimento.Month >= dataAgora.Month &&  dataNascimento.Day >= dataAgora.Day)
{  idade = dataAgora.Year – dataNascimento.Year; }
else
{  idade = dataAgora.Year – dataNascimento.Year – 1; }

Neste artigo vimos como trabalhar com datas utilizando a linguagem C# e o .NET Framework.

2 pensamentos sobre “Trabalhando com datas no C#

  1. Pingback: Trabalhando com datas no C# « EduOGama's Blog

  2. Muito boa essa explicação, mas por exemplo nesse último exemplo, se fosse dataNascimento = 11/04/1991 e dataAgora = 06/03/2013, daria 22 anos, sendo que o correto é 21. Mas adorei essa explicação, tanto que foi aparitr dela que consegui dar continuidade… O restante pelo que ví está perfeito… Parabénsss

Deixe um comentário