A struct DateTime, do namespace System, do .NET Framework é constantemente utilizada por desenvolvedores (lembrando que, como ela é uma struct também é usada como um tipo de dado).

Esta struct conta com dezenas de objetos para manipular valores relacionados a datas e horas, como é bem explicado pela documentação oficial da MSDN. Veremos neste artigo os principais e de uso comum pelos desenvolvedores no dia-a-dia.

Começando pelos construtores, quando instanciamos a struct temos nada menos que 12 sobrecargas nela (a 1ª vazia, por padrão), as quais podem ser vistas em detalhes neste link.

De métodos estáticos (que não precisam ser instanciados) temos 13 deles (sem contar o ReferenceEquals, que herda de Object e está presente na grande maioria dos objetos) onde destaco 4 deles, que serão descritos a seguir.
· DaysInMonth – Este método retorna um valor inteiro que mostra o número de dias de um mês, especificado pelo usuário. O método contém dois parâmetros, que são o ano e o mês, ambos do tipo int.

· IsLeapYear – Também retorna um valor inteiro, a diferença é que este método recebe apenas um parâmetro, que é o ano, do tipo int, e mostra se o ano fornecido pelo usuário é bissexto.

· Parse – Utilizado em diversos outros tipos de dados, o Parse serve para converter uma variável do tipo string para o tipo que executou o método (em nosso caso para DateTime). Seu método tem três sobrecargas, porém a mais utilizada é a 1ª, que espera uma string, representando a data a ser convertida.

· SpecifyKind – Retorna um DateTime com a data de acordo com o horário local, padrão UTC ou um valor não especificado, de acordo com o parâmetro DateTimeKind, do método. Como estamos no Brasil ele retorna a data no formato DD/MM/YYYY, caso estivéssemos nos EUA, por exemplo, ele retornaria MM/DD/YYYY.

A struct DateTime contém 28 métodos, abaixo é listado alguns deles.

· Add, AddDays, AddHours, AddMinutes, AddSeconds, AddYears – Este conjunto de métodos são utilizados, na ordem, para adicionar um intervalor de tempo, dias, horas, minutos, segundos e anos a variável que a chamou.

· Subtract – Como o nome sugere, este método subtrai um intervalo de tempo da variável que a chamou. Ele espera como parâmetro um objeto do tipo TimeSpan, que representa um intervalo de tempo, definido pelo usuário.

· ToLongDateString e ToLongTimeString – Converte a data para o formato longo de data (quarta-feira, 08 de Fevereiro de 2012) e/ou hora (00:00:00).

· ToShortDateString e ToShortTimeString – Faz a mesma operação que o método acima, apenas convertendo para o formato curto de data (08/02/2012) e/ou de hora (0:00).

A struct DateTime conta com 16 propriedades, 3 estáticas. Abaixo é listado 12 delas.

· Now, Today e Date – As 2 primeiras propriedades são estáticas (não necessitam de instanciação) e retornam, respectivamente, a data e hora exata, no momento em que a mesma for chamada, e o dia de hoje. A 3ª faz o mesmo que a propriedade Today, a diferença é que ela precisa ser instanciada pra ser utilizada.

· Day, DayOfWeek e DayOfYear – Como os nomes sugerem, estas propriedades retornam, respectivamente, o dia atual, o dia da semana (em inglês, é claro) e o dia do ano. Fazendo um teste com o dia em que este artigo foi feito, foram retornados, dia 08, dia da semana Wednesday e dia do ano 39.

· Hour, Minute, Second e Millisecond – Retornam, respectivamente, a hora, o minuto, o segundo e os milisegundos no momento em que as propriedades são executadas.

· Month e Year – Retornam o mês e ano atual.

Agora crie um projeto Console Application e adicione a ele uma classe, que conterá os métodos que faremos abaixo.

Na classe crie um método para retornar o número de dias do mês, de acordo com o mês passado no parâmetro, como ilustrado pela Listagem 01.

Listagem 01 – Método VerificaDias

public Int32 VerificaDias(Int32 Mes)
        {
            Int32 retorno = 0;
            switch (Mes)
            {
                case 1:
                    retorno = 31;
                    break;
                case 2:
                    retorno = DateTime.IsLeapYear(DateTime.Now.Year) ? 29 : 28;
                    break;
                case 3:
                    retorno = 31;
                    break;
                case 4:
                    retorno = 30;
                    break;
                case 5:
                    retorno = 31;
                    break;
                case 6:
                    retorno = 30;
                    break;
                case 7:
                    retorno = 31;
                    break;
                case 8:
                    retorno = 31;
                    break;
                case 9:
                    retorno = 30;
                    break;
                case 10:
                    retorno = 31;
                    break;
                case 11:
                    retorno = 30;
                    break;
                case 12:
                    retorno = 31;
                    break;
            }
            return retorno;
        }
Assim temos o retorno dos dias exatos do mês. Note que é usado o método IsLeapYear para verificar se o ano é bissexto.

A Listagem 02 ilustra a chamada ao método criado e o resultado em tela é visto na Figura 01.

Listagem 02 – Chamada ao método criado na Listagem 01


static void Main(string[] args)
        {
            Console.WriteLine(new Exemplos().VerificaDias(DateTime.Now.Month));
            Console.ReadKey();
        }
Note que é utilizado no parâmetro duas propriedades apresentadas neste artigo.



Figura 01 – Número de dias do mês corrente

Parecido com o método anterior, vamos criar um método que retorna o nome do mês atual, e que espera o número do mês como parâmetro.

A Listagem 03 exibe este método.

Listagem 03 – Método RetornaMes


public String RetornaMes(Int32 NumeroMes)
        {
            string retorno = string.Empty;
            switch (NumeroMes)
            {
                case 1:
                    retorno = "Janeiro";
                    break;
                case 2:
                    retorno = "Fevereiro";
                    break;
                case 3:
                    retorno = "Março";
                    break;
                case 4:
                    retorno = "Abril";
                    break;
                case 5:
                    retorno = "Maio";
                    break;
                case 6:
                    retorno = "Junho";
                    break;
                case 7:
                    retorno = "Julho";
                    break;
                case 8:
                    retorno = "Agosto";
                    break;
                case 9:
                    retorno = "Setembro";
                    break;
                case 10:
                    retorno = "Outubro";
                    break;
                case 11:
                    retorno = "Novembro";
                    break;
                case 12:
                    retorno = "Dezembro";
                    break;
            }
            return retorno;
        }
E se quisermos descobrir qual é o mês anterior e qual é o mês posterior ao mês que estamos? De cabeça é fácil saber a resposta mais como faríamos isso via código?

A Listagem 04 exibe a atribuição de duas variáveis com essas verificações, feitas por operadores ternários, muito úteis quando temos condições simples e queremos economizar linhas de código.

Listagem 04 – Descobrindo o mês anterior e o posterior

static void Main(string[] args)
        {
            var mesAnterior = DateTime.Now.Month - 1 > 0 ? DateTime.Now.Month - 1 : 12;
            var mesPosterior = DateTime.Now.Month + 1 < 12 ? DateTime.Now.Month + 1 : 1;
            Console.WriteLine(new Exemplos().RetornaMes(mesAnterior));
            Console.WriteLine(new Exemplos().RetornaMes(mesPosterior));
            Console.ReadKey();
        }

A Figura 02 exibe o resultado do código acima.



Figura 02 – Mês anterior e posterior ao mês atual

Crie mais exemplos práticos usando sua criatividade para brincar com datas e horas!

Assim finalizo o artigo. Muito obrigado a todos!

Um abraço, e até o próximo artigo.

Wellington Balbo de Camargo

wellingtonbalbo@gmail.com