Desenvolvimento - C#
DateDiff com intervalos escolhidos por você
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.
por Mauricio JuniorOlá 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)
Listagem 1 : Declarando o método
Listagem 2: Criando enum
Listagem 3: Definindo enum
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.
Listagem 4: Calculando
Listagem 5: Método GetYearQuarter
Listagem 6: gerar enum
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)
Listagem 1 : Declarando o método
public static long DateDiff(DateInterval intervalo, DateTime dtInicial, DateTime dtFinal)Esse parâmetro intervalo foi necessário criar “enum” específico, você pode gerar outros também se necessário. Veja o code 2.
Listagem 2: Criando enum
public enum DateInterval { Day, DayOfYear, Hour, Minute, Month, Quarter, Second, Weekday, Year, Milliseconds }Definido o “enum” no início da classe, basta criar o método fazendo as verificações. Code 3.
Listagem 3: Definindo enum
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; }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.
Listagem 4: Calculando
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); }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.
Listagem 5: Método GetYearQuarter
public static int GetYearQuarter(int month) { if (month <= 3) return 1; if (month <= 6) return 2; if (month <= 9) return 3; return 4; }Segue todo o código para não ter problemas no momento de uso como guia. Code 6.
Listagem 6: gerar enum
public enum DateInterval { Day, DayOfYear, Hour, Minute, Month, Quarter, Second, Weekday, Year, Milliseconds }Listagem 7: gerar método Quarte
public static int GetYearQuarter(int month) { if (month <= 3) return 1; if (month <= 6) return 2; if (month <= 9) return 3; return 4; }Listagem 8: 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.