none
Intevalo de datas. RRS feed

  • Pergunta

  • Olá pessoal.

    Preciso pegar o intervalo entre duas datas, sei que utilizo o timespan porém preciso recuperar desta forma ( 1 ano 11 mêses e 3 dias ) por exemplo.

    Alguém tem alguma idéia?

    Obrigado.

    segunda-feira, 18 de março de 2013 19:13

Respostas

  • Pessoal conseguir fazer de uma maneira bem legal, segue o código.

    public DataCalculada CacularIntervaloDatas(DateTime DtInicio, DateTime DtFim)
            {
                DataCalculada retorno = new DataCalculada();
                retorno.TempoIntervalo = DtFim.Subtract(DtInicio);
                int dias = (int)retorno.TempoIntervalo.TotalDays;
    
                int Ano = 0, Mes = 0, dia = 0, somaDay = 0;
                Ano = DtFim.Year - DtInicio.Year;
                if (DtFim.Month >= DtInicio.Month)
                    Mes = DtFim.Month - DtInicio.Month;
                else
                {
                    Mes = (DtFim.Month + 12) - DtInicio.Month;
                    Ano--;
                }
                if (DtFim.Day >= DtInicio.Day)
                    dia = DtFim.Day - DtInicio.Day;
                else
                {
                    somaDay = 30;
                    switch (DtInicio.Month)
                    {
                        case 1:
                        case 3:
                        case 5:
                        case 7:
                        case 8:
                        case 10:
                        case 12:
                            somaDay = 31;
                            break;
                        case 2:
                            somaDay = DateTime.IsLeapYear(DtInicio.Year) ? 29 : 28;
                            break;
                        case 4:
                        case 6:
                        case 9:
                        case 11:
                            somaDay = 30;
                            break;
                    }
    
                    dia = (DtFim.Day + somaDay) - DtInicio.Day;
    
                    if (Mes == 0)
                    {
                        Ano--;
                        Mes = 11;
                    }
                    else
                        Mes--;
                }
    
                string
                    infoA = Ano == 0 ? string.Empty : Ano > 1 ? Ano.ToString() + " anos " : Ano.ToString() + " ano "
                    , infoM = Mes == 0 ? string.Empty : Mes > 1 ? Mes.ToString() + " mêses e " : Mes.ToString() + " mês e "
                    , infoD = dia == 0 ? string.Empty : dia > 1 ? dia.ToString() + " dias " : dia.ToString() + " dia ";
    
                retorno.InformaPermanencia = "Permaneceu " + infoA + infoM + infoD;
    
                return retorno;
            }
        }
    
        public class DataCalculada
        {
            public TimeSpan TempoIntervalo { get; set; }
            public string InformaPermanencia { get; set; }
        }

    terça-feira, 19 de março de 2013 15:09
  • Utilize o método TimeSpan.FromDays(). Assim você abstrai toda essa lógica de anos bissextos e etc.:

    var data1 = DateTime.Parse("12/01/2013");
    var data2 = DateTime.Parse("13/01/2014");
    var span = TimeSpan.FromDays(data2.Subtract(data1).TotalDays);
    var resultado = string.Format("{0} ano(s) {1} mes(es) e {2} dia(s)", span.Years, span.Months, span.Days);



    Leonardo Lima da Silva

    segunda-feira, 15 de abril de 2013 19:57

Todas as Respostas

  • Olá,

    Para ter a diferença das duas datas em dias:

    var data1 = DateTime.Parse("12/01/2013");
    var data2 = DateTime.Parse("13/01/2014");
    
    var diferenca = data2.Subtract(data1).TotalDays;
    Depois é só fazer as divisões para pegar os valores que você quer.


    • Editado Israel Vilela segunda-feira, 18 de março de 2013 19:24
    • Sugerido como Resposta Vitor Mendes segunda-feira, 18 de março de 2013 20:26
    segunda-feira, 18 de março de 2013 19:23
  • Olá,

    Para ter a diferença das duas datas em dias:

    var data1 = DateTime.Parse("12/01/2013");
    var data2 = DateTime.Parse("13/01/2014");
    
    var diferenca = data2.Subtract(data1).TotalDays;
    Depois é só fazer as divisões para pegar os valores que você quer.


    Desta maneira estou ciente que da pra fazer mas não é exatamente o que preciso, precisaria algo parecido com o moderador entre uma divisão onde consigo pegar o resto só que seria pra data.

    Exp.

    Data inicio = '2012-12-30';

    Data Fim = '2015-12-31'

    onde a diferencia seria um periodo (permanencia 2 anos 11 meses e 31 dia) . seria isso!



    • Editado Romy Moura segunda-feira, 18 de março de 2013 22:08
    segunda-feira, 18 de março de 2013 22:06
  • Veja se este link lhe ajuda.

    http://pablobatistacardoso.wordpress.com/2012/12/11/subtraindo-datas-com-timespan-em-c/


    Leonardo Garcia
    pensouweb@hotmail.com

    segunda-feira, 18 de março de 2013 22:39
  • Veja se este link lhe ajuda.

    http://pablobatistacardoso.wordpress.com/2012/12/11/subtraindo-datas-com-timespan-em-c/


    Leonardo Garcia
    pensouweb@hotmail.com

    Olá Leandro dessa maneira eu já tinha feito.

    Só que a classe DateTime não da suporte para ano, mes e é o que eu preciso precisaria de algo para converter as horas em uma data.

    Exp: (8760) horas é relativo a um ano caso não seja bissexto

    (8784) seria relativo a 1 ano e um dia

    (8736) seria relativo a 11 meses e 30 dias

    e por ai vai preciso de algo que me retorne uma data referente as horas.

    terça-feira, 19 de março de 2013 13:20
  • Pessoal conseguir fazer de uma maneira bem legal, segue o código.

    public DataCalculada CacularIntervaloDatas(DateTime DtInicio, DateTime DtFim)
            {
                DataCalculada retorno = new DataCalculada();
                retorno.TempoIntervalo = DtFim.Subtract(DtInicio);
                int dias = (int)retorno.TempoIntervalo.TotalDays;
    
                int Ano = 0, Mes = 0, dia = 0, somaDay = 0;
                Ano = DtFim.Year - DtInicio.Year;
                if (DtFim.Month >= DtInicio.Month)
                    Mes = DtFim.Month - DtInicio.Month;
                else
                {
                    Mes = (DtFim.Month + 12) - DtInicio.Month;
                    Ano--;
                }
                if (DtFim.Day >= DtInicio.Day)
                    dia = DtFim.Day - DtInicio.Day;
                else
                {
                    somaDay = 30;
                    switch (DtInicio.Month)
                    {
                        case 1:
                        case 3:
                        case 5:
                        case 7:
                        case 8:
                        case 10:
                        case 12:
                            somaDay = 31;
                            break;
                        case 2:
                            somaDay = DateTime.IsLeapYear(DtInicio.Year) ? 29 : 28;
                            break;
                        case 4:
                        case 6:
                        case 9:
                        case 11:
                            somaDay = 30;
                            break;
                    }
    
                    dia = (DtFim.Day + somaDay) - DtInicio.Day;
    
                    if (Mes == 0)
                    {
                        Ano--;
                        Mes = 11;
                    }
                    else
                        Mes--;
                }
    
                string
                    infoA = Ano == 0 ? string.Empty : Ano > 1 ? Ano.ToString() + " anos " : Ano.ToString() + " ano "
                    , infoM = Mes == 0 ? string.Empty : Mes > 1 ? Mes.ToString() + " mêses e " : Mes.ToString() + " mês e "
                    , infoD = dia == 0 ? string.Empty : dia > 1 ? dia.ToString() + " dias " : dia.ToString() + " dia ";
    
                retorno.InformaPermanencia = "Permaneceu " + infoA + infoM + infoD;
    
                return retorno;
            }
        }
    
        public class DataCalculada
        {
            public TimeSpan TempoIntervalo { get; set; }
            public string InformaPermanencia { get; set; }
        }

    terça-feira, 19 de março de 2013 15:09
  • Utilize o método TimeSpan.FromDays(). Assim você abstrai toda essa lógica de anos bissextos e etc.:

    var data1 = DateTime.Parse("12/01/2013");
    var data2 = DateTime.Parse("13/01/2014");
    var span = TimeSpan.FromDays(data2.Subtract(data1).TotalDays);
    var resultado = string.Format("{0} ano(s) {1} mes(es) e {2} dia(s)", span.Years, span.Months, span.Days);



    Leonardo Lima da Silva

    segunda-feira, 15 de abril de 2013 19:57