DateDiff com intervalos escolhidos por você


por Mauricio Junior em 16/1/2012



Olá caro leitor, hoje gostaria de informar e mostrar como pegar o intervalo de uma data em mês, ano, dia, semana, segundos, mile segundos, quarto de tempo, minutos, horas e dias. 

Existem vários sistemas ou aplicativos que precisam calcular esse tipo de intervalo pelas datas cadastradas, e para minimizar o problema com intervalor o melhor é criar um método específico que faz o cálculo.

Tags: Microsoft .NET, Framework, C#.NET, ASP.NET, Windows Form, DateDiff, Intervalos

Começando a construir o método, o primeiro passo pensado foi criar uma classe estática. O retorno deve ser do tipo long, enviar um intervalo, data inicial e data final. (Code 1)

public static long DateDiff(DateInterval intervalo, DateTime dtInicial, DateTime dtFinal)
Code 1

Esse parâmetro intervalo foi necessário criar “enum” específico, você pode gerar outros também se necessário. Veja o code 2.

public enum DateInterval
{
Day,
       DayOfYear,
       Hour,
       Minute,
       Month,
       Quarter,
       Second,
       Weekday,
       Year,
       Milliseconds
}
Code 2

Definido o “enum” no início da classe, basta criar o método fazendo as verificações. Code 3.

public static long DateDiff(DateInterval intervalo, DateTime dtInicial, DateTime dtFinal)
        {
            if (intervalo == DateInterval.Year)
                return dtFinal.Year - dtInicial.Year;
            if (intervalo == DateInterval.Month)
                return (dtFinal.Month - dtInicial.Month) + (12 * (dtFinal.Year - dtInicial.Year));

            TimeSpan ts = dtFinal - dtInicial;
                
            if (intervalo == DateInterval.Day || interval == DateInterval.DayOfYear)
                return Round(ts.TotalDays);

            if (intervalo == DateInterval.Hour)
                return Round(ts.TotalHours);

            if (intervalo == DateInterval.Minute)
                return Round(ts.TotalMinutes);

            if (intervalo == DateInterval.Second)
                return Round(ts.TotalSeconds);

            if (intervalo == DateInterval.Milliseconds)
                return Round(ts.TotalMilliseconds);

            if (intervalo == DateInterval.Weekday )
                return Round(ts.TotalDays / 7.0);

            if (intervalo == DateInterval.Quarter)
            {
                double d1Quarter = GetYearQuarter(dtInicial.Month);
                double d2Quarter = GetYearQuarter(dtFinal.Month);
                double d1 = d2Quarter - d1Quarter;
                double d2 = (4 * (dtFinal.Year - dtInicial.Year));
                return Round(d1 + d2);
            }   

            return 0;
        }   
Code 3

Note que no decorrer do método algumas verificações de intervalo foram feitas como ano, mês e os outros colocados no “enum”. Cada um existe um cálculo específico e inteligente para o melhor funcionamento.

Todo intervalo que precisava ser verificado no sistema coloquei, talvez eu precise colocar mais ou você não precise disso tudo.

No caso de acrescentar outro tipo de intervalo no “enum” basta adicionar no método, pelo contrário o mesmo não será verificado. Se nenhum intervalo for informado, o retorno é 0.

O cálculo mais difícil é o do Quarter ou um quarto de tempo. Code 4.
if (intervalo == DateInterval.Quarter)
{
double d1Quarter = GetYearQuarter(dtInicial.Month);
       double d2Quarter = GetYearQuarter(dtFinal.Month);
       double d1 = d2Quarter - d1Quarter;
       double d2 = (4 * (dtFinal.Year - dtInicial.Year));
       return Round(d1 + d2);
}   
Code 4

Existe outro método sendo chamado de dentro do Quarter, o chamado GetYearQuarter que pega um quarto do ano. O método está no Code 5.

public static int GetYearQuarter(int month)   
{
if (month <= 3)   
       return 1;
if (month <= 6)   
       return 2;
if (month <= 9)   
       return 3;   
return 4;   
}   
Code 5
Segue todo o código para não ter problemas no momento de uso como guia. Code 6.

Primeiro passo: gerar enum.
public enum DateInterval
{
Day,
       DayOfYear,
       Hour,
       Minute,
       Month,
       Quarter,
       Second,
       Weekday,
       Year,
       Milliseconds
}

Segundo passo: gerar método Quarter
public static int GetYearQuarter(int month)   
{
if (month <= 3)   
       return 1;
if (month <= 6)   
       return 2;
if (month <= 9)   
       return 3;   
return 4;   
}   

Terceiro passo: método Datediff
public static long DateDiff(DateInterval intervalo, DateTime dtInicial, DateTime dtFinal)
{
if (intervalo == DateInterval.Year)
       return dtFinal.Year - dtInicial.Year;
if (intervalo == DateInterval.Month)
       return (dtFinal.Month - dtInicial.Month) + (12 * (dtFinal.Year - dtInicial.Year));

TimeSpan ts = dtFinal - dtInicial;
                
       if (intervalo == DateInterval.Day || interval == DateInterval.DayOfYear)
       return Round(ts.TotalDays);

if (intervalo == DateInterval.Hour)
       return Round(ts.TotalHours);

if (intervalo == DateInterval.Minute)
       return Round(ts.TotalMinutes);

if (intervalo == DateInterval.Second)
       return Round(ts.TotalSeconds);

if (intervalo == DateInterval.Milliseconds)
       return Round(ts.TotalMilliseconds);

if (intervalo == DateInterval.Weekday )
       return Round(ts.TotalDays / 7.0);

if (intervalo == DateInterval.Quarter)
       {
       double d1Quarter = GetYearQuarter(dtInicial.Month);
             double d2Quarter = GetYearQuarter(dtFinal.Month);
             double d1 = d2Quarter - d1Quarter;
             double d2 = (4 * (dtFinal.Year - dtInicial.Year));
             return Round(d1 + d2);
}   

       return 0;
}   

Espero que tenha ajudado e qualquer dúvida pode entrar em contato.

voltar   comente  subir

 
Mauricio Junior Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; .
Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna. Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, ECODE10.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A. Blog: blog.mauriciojunior.org, Site pessoal www.mauriciojunior.org



Comentários:

Comente (dê sua opinião):
Comentário:
Código Imagem:  (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

 

Outros Artigos do Autor

Mais um certificado Microsoft
Criando Email Modelo no Mail - MacBook
Conecte - netBOOKS
M-Payment com Google Wallet
Nova forma de utilizar cache utilizando Visual Studio.NET 2005
Criando XML a partir de um DATASET tipado – Parte II
Sistema de Login em ASP – Parte II
Encontrar o valor no texto
Montando Menu Dinâmico com Banco de Dados
Resources como padrão de mensagens
iSecurity Password Free
Atalho novo, formatar e concatenar usando Visual Studio .NET 2010
Método MD5
GridView Parte III
Sistema de Login em ASP – Parte III
Usando themes ASP.NET 2.0 (Parte 1)
Podcast publicado no site
Vídeo - Ler EventLog do Windows usando C#.NET
Vídeo: Série Atlas.NET - Parte II
Criando Splash - Com Efeito
Virus: Provocando sua curiosidade
User Control Windows executando no Internet Explorer (parte 2 de 2)
Dica para buscar nome de tabelas ou stored procedures dentro do banco de dados
Comando para compilação .NET
Detectando ENTER
ASP.NET MVC
Gerando uma dll com sistema web
Evento Brasil DotNet - gratuíto
Padrões de nomenclaturas
ASPNETi no seu celular
VS 11 preparado para HTML 5
Gerando word com Visual Studio.NET 2005
Usando PopupControlExtender
Gerando instalador de serviço
Acessando banco de dados com pocket pc